题面在这里

题意:给定一个无向图,从1号节点出发,每次等概率选择连接该节点的一条边走到另一个节点,到达n号节点时,将走过的路径上的所有边权异或起来,求这个异或和的期望

sol

一道期望大火题(表示看了zsy大佬ycb大佬的题解才过去的orz)

递推期望,因为是异或和,按照正常方法会很难,于是考虑按位DP(套路吧),即对于边权在二进制下的每一位分别讨论

设状态的时候需要注意

如果设\(f[x]\)表示从1号节点到达x号节点且异或和为1的概率

那么在转移的时候,因为到达n号节点的时候就已经停止,所以f[n]不能转移;而我们又必须求出\(f[n]\),因此必须先对除n以外的所有点进行计算,再推到n,这样会很麻烦

于是想到倒着推,设\(f[x]\)表示从x号节点到达n号节点且异或和为1的概率,答案为\(f[1]\),虽然说也不能从\(f[n]\)转移,但因为要求解的不是\(f[n]\)所以就让求解变得可行了

通过边进行转移:

\[f[u]=\sum_{v}\frac{f[v]}{d[u]}*[(u,v)==0]+\sum_{v}\frac{1-f[v]}{d[u]}*[(u,v)==1]
\]

意即该位权值为1的点通过0边和该位权值为0的点通过1边到达点u所得的该位权值都是1

由于每个f[u]都和另外的f[v]产生依赖关系,故无法直接递推求解

高斯消元大显身手啦!!!!!!

代码

#include<bits/stdc++.h>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<iomanip>
#include<cstring>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define mp make_pair
#define pb push_back
#define RG register
#define il inline
using namespace std;
const int mod=1e9+7;
const int N=110;
const double eps=1e-10;
typedef unsigned long long ull;
typedef vector<int>VI;
typedef long long ll;
typedef double dd;
il ll read(){
RG ll data=0,w=1;RG char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch<='9'&&ch>='0')data=data*10+ch-48,ch=getchar();
return data*w;
} int n,m,head[N],nxt[N*N*2],to[N*N*2],val[N*N*2],d[N],cnt;
il void add(int u,int v,int w){
to[++cnt]=v;d[v]++;
val[cnt]=w;
nxt[cnt]=head[u];
head[u]=cnt;
} dd S[35][N][N],ans[35][N],sum;
il bool gauss(int a){
//高斯消元部分
for(RG int i=1;i<=n;i++){
for(RG int j=i;j<=n;j++)
if(abs(S[a][j][i])>eps){
swap(S[a][j],S[a][i]);break;
}
if(abs(S[a][i][i])<=eps)return 0;
for(RG int j=i+1;j<=n;j++){
ans[a][j]-=ans[a][i]*S[a][j][i]/S[a][i][i];
for(RG int k=n;k>=i;k--)
S[a][j][k]-=S[a][i][k]*S[a][j][i]/S[a][i][i];
}
} for(RG int i=n;i;i--){
for(RG int j=i+1;j<=n;j++)
ans[a][i]-=S[a][i][j]*ans[a][j];
ans[a][i]/=S[a][i][i];
} return 1;
} int main()
{
n=read();m=read();
for(RG int i=1,u,v,w,t;i<=m;i++){
u=read();v=read();w=read();t=0;
add(u,v,w);if(u!=v)add(v,u,w);
} //这里是统计系数
for(RG int u=1;u<n;u++){
for(RG int i=0;i<=32;i++)S[i][u][u]+=1.0;
for(RG int i=head[u];i;i=nxt[i]){
RG int v=to[i],t=0;
while(t<=32){
S[t][u][v]+=((val[i]&1)?1:(-1))*1.0/(d[u]*1.0);
ans[t][u]+=((val[i]&1)?1:0)*1.0/(d[u]*1.0);
val[i]>>=1;t++;
}
}
}for(RG int i=0;i<=32;i++)S[i][n][n]+=1.0;
//这样可以保证最后f[n]==0消除f[n]的影响 for(RG int i=0;i<=32;i++)gauss(i); for(RG ll i=0,x=1;i<=32;i++){sum+=ans[i][1]*x;x<<=1;}
//按位统计答案 printf("%.3lf\n",sum);
return 0;
}

注:还有一道[HNOI2013]游走和此题思想类似,题解在这里

[HNOI2011]XOR和路径的更多相关文章

  1. 【概率DP/高斯消元】BZOJ 2337:[HNOI2011]XOR和路径

    2337: [HNOI2011]XOR和路径 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 682  Solved: 384[Submit][Stat ...

  2. BZOJ2337: [HNOI2011]XOR和路径

    题解: 异或操作是每一位独立的,所以我们可以考虑每一位分开做. 假设当前正在处理第k位 那令f[i]表示从i到n 为1的概率.因为不是有向无环图(绿豆蛙的归宿),所以我们要用到高斯消元. 若有边i-& ...

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

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

  4. BZOJ 2337: [HNOI2011]XOR和路径 [高斯消元 概率DP]

    2337: [HNOI2011]XOR和路径 题意:一个边权无向连通图,每次等概率走向相连的点,求1到n的边权期望异或和 这道题和之前做过的高斯消元解方程组DP的题目不一样的是要求期望异或和,期望之间 ...

  5. [HNOI2011]XOR和路径 && [HNOI2013]游走

    [HNOI2011]XOR和路径 题目大意 具体题目:戳我 题目: 给定一个n个点,m条边的有重边.有自环的无向图,其中每个边都有一个边权. 现在随机选择一条1到n的路径,路径权值为这条路径上所有边权 ...

  6. 【BZOJ 2337】 2337: [HNOI2011]XOR和路径(概率DP、高斯消元)

    2337: [HNOI2011]XOR和路径 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1170  Solved: 683 Description ...

  7. 【BZOJ2337】[HNOI2011]XOR和路径 期望DP+高斯消元

    [BZOJ2337][HNOI2011]XOR和路径 Description 题解:异或的期望不好搞?我们考虑按位拆分一下. 我们设f[i]表示到达i后,还要走过的路径在当前位上的异或值得期望是多少( ...

  8. [Wc2011] Xor 和 [HNOI2011]XOR和路径

    Xor F.A.Qs Home Discuss ProblemSet Status Ranklist Contest 入门OJ ModifyUser  autoint Logout 捐赠本站 Prob ...

  9. LG3211 [HNOI2011]XOR和路径

    题意 题目描述 给定一个无向连通图,其节点编号为 1 到 N,其边的权值为非负整数.试求出一条从 1 号节点到 N 号节点的路径,使得该路径上经过的边的权值的"XOR 和"最大.该 ...

  10. 【BZOJ】2337: [HNOI2011]XOR和路径 期望+高斯消元

    [题意]给定n个点m条边的带边权无向连通图(有重边和自环),在每个点随机向周围走一步,求1到n的期望路径异或值.n<=100,wi<=10^9. [算法]期望+高斯消元 [题解]首先异或不 ...

随机推荐

  1. String,StringBuffer,StringBuilder的区别

    数据结构: 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合. 比如数据库就是对硬盘中的数据进行有规则的管理,可以进行增删改查工作,而良好的数据结构可以优化这些操作, 也许大家会想这些和St ...

  2. Hadoop源码分类概要整理

    最近突然觉得, 很多掌握的都还是很浅的原理,需要更深入细粒度去了解整个分布式系统的运转机制.于是..开始作死而又作死而又作死的源码之旅. Hadoop包的功能总共有下列几类: tool:提供一些命令行 ...

  3. CentOS7上Docker安装与卸载

    安装 1.安装Docker 参见:https://docs.docker.com/engine/installation/linux/centos/ 2.直接使用root安装(更新系统) yum up ...

  4. HashMap中的散列函数、冲突解决机制和rehash

    一.概述 散列算法有两个主要的实现方式:开散列和闭散列,HashMap采用开散列实现. HashMap中,键值对(key-value)在内部是以Entry(HashMap中的静态内部类)实例的方式存储 ...

  5. HDU 3001(状态压缩dp)

    状态压缩dp的第一题! 题意:Mr ACMer想要进行一次旅行,他决定访问n座城市.Mr ACMer 可以从任意城市出发,必须访问所有的城市至少一次,并且任何一个城市访问的次数不能超过2次.n座城市间 ...

  6.     My GitHub

    0.引言 利用python开发,借助Dlib库捕获摄像头中的人脸,进行实时特征点标定: 图1 工程效果示例(gif) 图2 工程效果示例(静态图片) (实现比较简单,代码量也比较少,适合入门或者兴趣学 ...

  7. 原码,反码,补码 与(&) 或(|) 非(~) 异或(^) 左移 << 右移 >> 无符号右移 >>>

    原码 数字在计算机中以二进制表示,8位的字长,最高位是符号位, 正数为0,负数为1.比如,3为0000 0011: -3为1000 0011. 注意,Java中int为32位.3的16进制表示为3,- ...

  8. Centos下安装Lamp和vsftpd、redis

    yum安装httpd和php.mysql服务 yum search httpd //搜索httpd开头的软件包 yum install httpd.x86_64 //找到apache 对应的软件包名 ...

  9. EmguCV中图像类型进行转换

    1.       Bitmap:类型不在 Emgucv命名空间中 2.       Image<TColor, TDepth> 3.       Mat: 4.       UMat: 高 ...

  10. Nodejs的运行原理-libuv篇

    前言 这应该是Nodejs的运行原理的第7篇分享,这篇过后,短时间内不会再分享Nodejs的运行原理,会停更一段时间,PS:不是不更,而是会开挖新的坑,最近有在研究RPG Maker MV,区块链,云 ...