【bzoj2337】【HNOI2011】【XOR和路径】【高斯消元】
2016-07-12 07:59
363 查看
Description
题解:
按位考虑,假设当前考虑到第x位.
f[i]表示从i到n第x位是1的概率.
枚举i的后继节点j
如果i到j的边第x位是1,那f[i]+=1/d[i]*(1-f[j]);
如果i到j的边第x为是0,那f[i]+=1/d[i]*f[j];
f
=0;
这样对于每个i都可以列出一个方程,高斯消元即可.
每次把f[1]*(2^x)累加进答案即可.
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #define N 510 #define M 10010 using namespace std; double ans,a ,p ; int n,m,cnt,x,y,v,d ,bin ,point ,next[M<<1]; struct use{ int st,en,v; }e[M<<1]; int read(){ int x(0);char ch=getchar(); while(ch<'0'||ch>'9') ch=getchar(); while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); return x; } void add(int x,int y,int v){ d[x]++; next[++cnt]=point[x];point[x]=cnt; e[cnt].st=x;e[cnt].en=y;e[cnt].v=v; } void gauss(){ for (int i=1;i<=n;i++){ int k=i; for (int j=i+1;j<=n;j++) if (fabs(a[j][i])>fabs(a[k][i])) k=j; if (k!=i) for (int j=1;j<=n+1;j++) swap(a[i][j],a[k][j]); for (int j=i+1;j<=n;j++){ double temp=-a[j][i]/a[i][i]; for (int x=1;x<=n+1;x++) a[j][x]+=a[i][x]*temp; } } for (int i=n;i>=1;i--){ for (int j=i+1;j<=n;j++) a[i][n+1]-=a[i][j]*p[j]; p[i]=a[i][n+1]/a[i][i]; } } int main(){ n=read();m=read(); for (int i=1;i<=m;i++){ x=read();y=read();v=read(); add(x,y,v);if (x!=y)add(y,x,v); } bin[0]=1; for (int i=1;i<=30;i++) bin[i]=bin[i-1]*2; for (int k=0;k<=30;k++){ memset(a,0,sizeof(a)); for (int i=1;i<n;i++){ double temp=1.0/d[i]; a[i][i]=1.0; for (int j=point[i];j;j=next[j]) if (e[j].v&bin[k]) a[i][e[j].en]+=temp,a[i][n+1]+=temp; else a[i][e[j].en]-=temp; } a =1.0; gauss(); ans+=p[1]*bin[k]; } printf("%.3f\n",ans); }
相关文章推荐
- {题解}[jzoj1237]餐桌
- Nested List Weight Sum
- JVM性能调优之生成堆的dump文件
- 邦德I
- Adobe Flash CC 2015常用快捷键——For程序员
- python学习——偏函数
- CF——Mike and Shortcuts(BFS)
- 花瓣网分析【惠龙之 :洋葱头】
- android中需要牢记的单词(java篇)
- [转载]设置或更改服务器排序规则
- 一台够靠谱的冰箱,让我的欧洲杯时光如此幸福
- 代理(正反)
- System.getProperty方法汇总
- java动态代理实现
- Android应用程序(APK)的编译打包过程
- [学习笔记]C# Socket初试-客户端
- iOS动画(Core Animation)总结
- 教你如何循环显示超长图片
- output元素的追加和表单的验证
- Identical Binary Tree