[HNOI2011]XOR和路径
题面在这里
题意:给定一个无向图,从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]\)所以就让求解变得可行了
通过边进行转移:
\]
意即该位权值为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和路径的更多相关文章
- 【概率DP/高斯消元】BZOJ 2337:[HNOI2011]XOR和路径
2337: [HNOI2011]XOR和路径 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 682 Solved: 384[Submit][Stat ...
- BZOJ2337: [HNOI2011]XOR和路径
题解: 异或操作是每一位独立的,所以我们可以考虑每一位分开做. 假设当前正在处理第k位 那令f[i]表示从i到n 为1的概率.因为不是有向无环图(绿豆蛙的归宿),所以我们要用到高斯消元. 若有边i-& ...
- BZOJ 2337: [HNOI2011]XOR和路径( 高斯消元 )
一位一位考虑异或结果, f(x)表示x->n异或值为1的概率, 列出式子然后高斯消元就行了 --------------------------------------------------- ...
- BZOJ 2337: [HNOI2011]XOR和路径 [高斯消元 概率DP]
2337: [HNOI2011]XOR和路径 题意:一个边权无向连通图,每次等概率走向相连的点,求1到n的边权期望异或和 这道题和之前做过的高斯消元解方程组DP的题目不一样的是要求期望异或和,期望之间 ...
- [HNOI2011]XOR和路径 && [HNOI2013]游走
[HNOI2011]XOR和路径 题目大意 具体题目:戳我 题目: 给定一个n个点,m条边的有重边.有自环的无向图,其中每个边都有一个边权. 现在随机选择一条1到n的路径,路径权值为这条路径上所有边权 ...
- 【BZOJ 2337】 2337: [HNOI2011]XOR和路径(概率DP、高斯消元)
2337: [HNOI2011]XOR和路径 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1170 Solved: 683 Description ...
- 【BZOJ2337】[HNOI2011]XOR和路径 期望DP+高斯消元
[BZOJ2337][HNOI2011]XOR和路径 Description 题解:异或的期望不好搞?我们考虑按位拆分一下. 我们设f[i]表示到达i后,还要走过的路径在当前位上的异或值得期望是多少( ...
- [Wc2011] Xor 和 [HNOI2011]XOR和路径
Xor F.A.Qs Home Discuss ProblemSet Status Ranklist Contest 入门OJ ModifyUser autoint Logout 捐赠本站 Prob ...
- LG3211 [HNOI2011]XOR和路径
题意 题目描述 给定一个无向连通图,其节点编号为 1 到 N,其边的权值为非负整数.试求出一条从 1 号节点到 N 号节点的路径,使得该路径上经过的边的权值的"XOR 和"最大.该 ...
- 【BZOJ】2337: [HNOI2011]XOR和路径 期望+高斯消元
[题意]给定n个点m条边的带边权无向连通图(有重边和自环),在每个点随机向周围走一步,求1到n的期望路径异或值.n<=100,wi<=10^9. [算法]期望+高斯消元 [题解]首先异或不 ...
随机推荐
- WEB-INF目录下文件复制的几种方式
2018年1月31日 10:42:55 工作完写点博客记录下. 需求:从web-inf下拷贝文件到指定目录. 目录结构 直接贴代码 第一种方式,字节流读取 try { int index = 0; S ...
- yii2 源码分析 Component类分析 (二)
转载请注明链接http://www.cnblogs.com/liuwanqiu/p/6739538.html 组件(component),是Yii框架的基类,实现了属性.事件.行为三类功能,它集成自o ...
- Linux下配置APACHE支持PHP环境
编辑 /usr/local/apache2/conf/httpd.conf 文件时要注意: 找到: AddType application/x-compress .Z AddType applicat ...
- windows服务器修改登录密码
1. 右键我的电脑---管理 2. 计算机管理---本地用户和组--用户 3. 右键administrator用户,选择修改密码 4. 点击继续进入下一步 5. 输入新密码并保存
- JMeter之Http协议接口性能测试
一.不同角色眼中的接口 1.1,开发人员眼中的接口 1.2,测试人员眼中的接口 二.Http协议基本介绍 2.1,常见的接口协议 1.:2. :3. :4.:5.: 6. 2.2,Http协议栈 ...
- C语言_来了解一下GCC编译器编译C可执行脚本的过程
GCC简介 Linux系统下的gcc(GNU C Compiler)是GNU推出的功能强大.性能优越的多平台编译器,是GNU的代表作品之一.gcc是可以在多种硬体平台上编译出可执行程序的超级编译 ...
- 微信小程序半周问题总结
新产品要做一个微信小程序,不想吐槽老板没给任何准备就给出了需求和原型图,好像默认小程序闭着眼睛就可以很顺利开发好.现在半周下来(五一结束开始到今天)完成了差不多所有的界面,网络请求部分还跟服务端兄弟耗 ...
- 如何架构一个合适的企业API网关
API Gateway(API GW / API 网关),顾名思义,是出现在系统边界上的一个面向API的.串行集中式的强管控服务,这里的边界是企业IT系统的边界,主要起到隔离外部访问与内部系统的作用. ...
- shell 批量创建带随机字符串的html文件
思路一: echo $RANDOM|md5sum |tr "[0-9]" "[a-j]"|cut -c 2-11 RANDOM: linux内置的随机数变量 ...
- Http协议规范及格式
HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP协议的详细内容请参考RFC2616.HTTP协议采用了请求/响应模型.客户 ...