[BZOJ 2337][HNOI2011]XOR和路径

本文介绍了一种使用高斯消元法进行矩阵求逆的算法,并将其应用于概率图模型中,通过构建图模型来解决概率问题。具体实现包括定义矩阵、进行高斯消元求逆、构建概率图模型等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BZOJ传送门

洛谷传送门

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define rep(i,a,b) for(int i=a;i<=b;++i)
 4 #define fd(i,a,b) for(int i=a;i>=b;--i)
 5 const double eps = 1e-8;
 6 const int maxn=110;
 7 double v[maxn][maxn];
 8 inline void guess(int n) {
 9     rep(i,1,n) {
10         fd(k,n+1,i) v[i][k] /= v[i][i];
11         rep(k,i+1,n) {
12             double bs=v[k][i];
13             rep(j,i,n+1) v[k][j]-=v[i][j]*bs;
14         }
15     }
16     fd(i,n,1) rep(k,i+1,n) 
17         v[i][n+1]-=v[i][k]*v[k][n+1];
18 }
19 struct Edge {
20     int v,w;Edge *to; 
21     Edge(int v,int w,Edge *to):v(v),w(w),to(to){} 
22     Edge() {}
23 }*head[maxn],pool[200000],*pis=pool;
24 int n,m,op[maxn];
25 void build(int l) {
26     memset(v,0,sizeof(v)); rep(i,1,n) v[i][i]=1;
27     rep(i,1,n-1) {
28         for(Edge *now=head[i];now;now=now->to)
29             if(now->w&(1<<l)) v[i][now->v]+=1.0/op[i],v[i][n+1]+=1.0/op[i];
30             else v[i][now->v]-=1.0/op[i];
31     }
32 }
33 inline int gi() {
34     int x=0;char o;bool f=true;for(;!isdigit(o=getchar());)if(o=='-')f=false;
35     for(;isdigit(o);o=getchar())x=(x<<1)+(x<<3)+(o&15);return f?x:~x+1;
36 }
37 int main() {
38     n=gi();m=gi();
39     rep(i,1,m) {
40         int u=gi(),v=gi(),w=gi();
41         head[u]=new(pis++)Edge(v,w,head[u]),++op[u];
42         if(u^v) head[v]=new(pis++)Edge(u,w,head[v]),++op[v];
43     }
44     double ans=0.0;
45     rep(i,0,30) {
46         build(i); guess(n); 
47         ans+=v[1][n+1]*(1<<i);
48     }
49     printf("%.3lf\n",ans);
50 }
View Code

 

转载于:https://www.cnblogs.com/miecoku/p/9761126.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值