求点1到点n经过的路径权值异或和的期望。

考虑按位计算,对于每一位来说,令dp[i]表示从i到n的异或和期望值。

那么dp[i]=sum(dp[j]+1-dp[k]).如果w(i,j)这一位为0,如果w(i,k)这一位为1.边界为dp[n][n]=0.

那么求解每个方程组就得到了每一位的贡献。另外注意自环的出理就ok了。

# include <cstdio>
# include <cstring>
# include <cstdlib>
# include <iostream>
# include <vector>
# include <queue>
# include <stack>
# include <map>
# include <set>
# include <cmath>
# include <algorithm>
using namespace std;
# define lowbit(x) ((x)&(-x))
# define pi acos(-1.0)
# define eps 1e-9
# define MOD 1000000000
# define INF 1000000000
# define mem(a,b) memset(a,b,sizeof(a))
# define FOR(i,a,n) for(int i=a; i<=n; ++i)
# define FO(i,a,n) for(int i=a; i<n; ++i)
# define bug puts("H");
# define lch p<<1,l,mid
# define rch p<<1|1,mid+1,r
# define mp make_pair
# define pb push_back
typedef pair<int,int> PII;
typedef vector<int> VI;
# pragma comment(linker, "/STACK:1024000000,1024000000")
typedef long long LL;
int Scan() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
void Out(int a) {if(a<0) {putchar('-'); a=-a;}if(a>=10) Out(a/10);putchar(a%10+'0');
}
const int N=105;
//Code begin...struct Edge{int p, next, w;}edge[20005];
int head[N], cnt=1, dee[N];
double a[N][N], x[N];
int equ, var;void add_edge(int u, int v, int w){edge[cnt].p=v; edge[cnt].next=head[u]; edge[cnt].w=w; head[u]=cnt++;
}
int Guass(){int i, j, k, col, max_r;for (k=0, col=0; k<equ&&col<var; ++k, ++col){max_r=k;FO(i,k+1,equ) if (fabs(a[i][col])>fabs(a[max_r][col])) max_r=i;if (fabs(a[max_r][col])<eps) return 0;if (k!=max_r) {FO(j,col,var) swap(a[k][j],a[max_r][j]); swap(x[k],x[max_r]);}x[k]/=a[k][col];FO(j,col+1,var) a[k][j]/=a[k][col];a[k][col]=1;FO(i,0,equ) if (i!=k) {x[i]-=x[k]*a[i][col];FO(j,col+1,var) a[i][j]-=a[k][j]*a[i][col];a[i][col]=0;}}return 1;
}
int main ()
{int n, m, u, v, w;double ans=0;scanf("%d%d",&n,&m);equ=var=n;while (m--) {scanf("%d%d%d",&u,&v,&w);--u; --v;if (u!=v) add_edge(u,v,w), add_edge(v,u,w), ++dee[v];else add_edge(u,v,w);++dee[u];}FO(i,0,32) {mem(a,0); mem(x,0);FO(j,0,n-1) {a[j][j]=dee[j];for (int k=head[j]; k; k=edge[k].next) {v=edge[k].p; w=edge[k].w;if (w&(1<<i)) {a[j][v]+=1; x[j]+=1;}else a[j][v]-=1;}}a[n-1][n-1]=1;Guass();ans+=(x[0]*(1<<i));}printf("%.3f\n",ans);return 0;
}

View Code

转载于:https://www.cnblogs.com/lishiyao/p/6744388.html

BZOJ 2337 XOR和路径(概率DP)相关推荐

  1. 【BZOJ - 4318】OSU!(概率dp,数学期望,期望的线性性)

    题干: osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: 一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1个长度为n的01串. ...

  2. bzoj 4820: [Sdoi2017]硬币游戏 概率dp+高斯消元+KMP

    题意 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利. 大家纷纷觉得这个游戏非常符合同学们的特色,但只是扔硬币实在是太单调了. 同学们觉得要加强趣味性,所以要找一个同学扔很多 ...

  3. bzoj 3450: Tyvj1952 Easy(概率DP)

    3450: Tyvj1952 Easy Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 828  Solved: 613 [Submit][Statu ...

  4. BZOJ 2337: [HNOI2011]XOR和路径( 高斯消元 )

    一位一位考虑异或结果, f(x)表示x->n异或值为1的概率, 列出式子然后高斯消元就行了 --------------------------------------------------- ...

  5. 【BZOJ - 3036】绿豆蛙的归宿(概率DAG图dp,拓扑排序,概率dp,期望的线性性)

    题干: 随着新版百度空间的下线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 给出一个有向无环的连通图,起点为1终点为N,每条边都有一个长度.绿豆蛙从起点出发,走向终点. 到达每一个顶点时,如 ...

  6. BZOJ 3270: 博物馆 1778: 驱逐猪猡 【概率DP+高斯消元】

    题目描述: 中文题面,不多解释.1778传送门 3270 传送门 (博物馆)题目分析: 也许很多人做概率题的时候都有种虚幻感..感觉莫名其妙就得出一个期望.概率,一知半解... 所以我在这里仔细地剖析 ...

  7. 线性代数五之高斯消元——[SDOI2010]外星千足虫,[HNOI2013]游走,[HNOI2011]XOR和路径,[hdu 4035]Maze

    多类型高斯消元杂题 [SDOI2010]外星千足虫 description solution code [HNOI2013]游走 description solution code [HNOI2011 ...

  8. 【CodeForces - 518D】Ilya and Escalator(概率dp,数学期望)

    题干: Ilya got tired of sports programming, left university and got a job in the subway. He was given ...

  9. 插头DP 概率DP / 期望DP

    插头DP && 概率DP / 期望DP 写在前面: 插头DP P5056 [模板]插头dp 手写哈希表的方法: 拉链法的代码如下: 开放寻址法的代码如下: 接下来是这道题的代码实现: ...

最新文章

  1. Android实时取景:用SurfaceView实现
  2. 零基础实践深度学习之数学基础
  3. (provider: 共享内存提供程序, error: 0 - 管道的另一端上无任何进程。) (Microsoft SQL Server,错误: 233)...
  4. 技术人写作和写代码一样重要
  5. appcrash事件怎么解决_突发事件中身心容易紧张焦虑,该如何控制心理压力与情绪?...
  6. ctfshow-WEB-web10( with rollup注入绕过)
  7. dategurd oracle_Oracle Dataguard 基本原理
  8. lammps教程:薄膜渗透过滤模拟--平衡弛豫过程
  9. c语言图像的简单叠加,第10章C语言图形编程.ppt
  10. iMindMap2020 中文旗舰免费版
  11. ubuntu修改dns服务器,配置Ubuntu DNS服务器
  12. 华为一直响应服务器异常,服务器不断异常重启
  13. Android 设备在Play Store无法搜索下载Netflix软件
  14. 39岁阿里P9提前退休,资产1.5亿,北京4套房!职场人的离职悲喜各不相同
  15. 读书笔记期货市场技术分析
  16. 《Thinking in Bets》读书分享 - 如何在信息不完全情况下做出更好的决策(1)
  17. 佐治亚大学计算机工程本科课程,美国大学本科专业排名:计算机工程.docx
  18. Jmeter入门(一)使用Jmeter进行简单的性能测试
  19. 企业官网小程序搭建教程
  20. 判定覆盖 与 条件覆盖 的区别

热门文章

  1. 插入的数据不能时时查询到_漫谈 LevelDB 数据结构(一):跳表(Skip List)
  2. c++ floor 赋值_C++之floor函数
  3. 勤哲excel 2007服务器 模板分类为空,勤哲Excel服务器20088.7完整企业版
  4. 处理增删改_实现数据的增删改查
  5. java jigsaw demo_Java9模块化(Jigsaw)初识
  6. c ++基本数据类型_C ++中的数据类型
  7. webmin安装_如何在Ubuntu 18.04上安装Webmin
  8. iOS UITextView和UITextViewDelegate
  9. Java中的AtomicInteger
  10. python矩阵_Python矩阵