题面在这里

题意:给定一个无向图,从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. 异步任务利器Celery(一)介绍

    django项目开发中遇到过一些问题,发送请求后服务器要进行一系列耗时非常长的操作,用户要等待很久的时间.可不可以立刻对用户返回响应,然后在后台运行那些操作呢? crontab定时任务很难达到这样的要 ...

  2. centos 6 安装zabbix 3.0

    1.安装PHP Zabbix 3.0对PHP的要求最低为5.4,而CentOS6默认为5.3.3,完全不满足要求,故需要利用第三方源,将PHP升级到5.4以上,注意,不支持PHP7 rpm -ivh  ...

  3. ps色彩范围抠章

    1.在photoshop打开需要抠公章的图像文件2.使用椭圆形选区工具,ALT+SHIFT+鼠标左键,选择章的范围 2.CTRL+J,复制图层,得到图层1,隐藏背景 3.CTRL+L,调整色阶,拖动两 ...

  4. IDA学习笔记 函数调用约定

    stdcall和cdecl: stdcall和cdecl 压栈方向都是从右到左 区别在于c约定是调用方在函数返回后add esp,n指令清除堆栈中的参数,而stdcall在被调函数内使用ret n来清 ...

  5. python函数的面向对象——面向对象设计

    通过几个函数式编号演进,理解面向对象设计 def01.py dog1 = { 'name':'元昊', 'gender':'母', 'type':'藏獒' } dog2 = { 'name':'李李' ...

  6. CentOS利用Nginx+Docker部署.netcore应用

    安装docker 官方文档https://docs.docker.com/engine/installation/linux/docker-ce/centos/ [root@sn ~]# yum re ...

  7. tpframe框架之slide模块的使用

    最新版git:https://gitee.com/37duman/tpframe 下载插件 点击下载slide插件 安装插件 把下载下来的插件解压后放置在addon文件夹 登录后台,点击插件管理 点击 ...

  8. [翻译]编写高性能 .NET 代码 第二章:垃圾回收 基本操作

    返回目录 基本操作 垃圾回收的算法细节还在不断完善中,性能还会有进一步的提升.下文介绍的内容在不同的.NET版本里会略有不同,但大方向是不会有变动的. 在.net进程里会管理2个类型的内存堆:托管和非 ...

  9. 微信小程序下拉框

    微信小程序里没有和HTML里的下拉框一样的组件,想要相同的效果只能自己写一个,先看效果 下面来看一下代码: 首先WXML <view class='select_box'> <vie ...

  10. Java多维数组各轴长度可以不对齐