思路

看到异或,容易联想到二进制位之间是相互独立的,所以可以把问题变成每个二进制位为1的概率再乘上(1<<pos)的值

假设现在考虑到pos位,设f[i]为第i个节点期望的异或和第pos位是1的概率,有这样的转移方程

\[f[u]=\frac{1}{d[u]}\sum_{v}[w[i]_{pos}=1]?(1-f[v]):f[v]
\]

这是一个逆推的方程,所以f[n]=0,f[1]就是答案

然后这个方程互相依赖,所以上高斯消元求解即可

代码

注意有点卡精度,换成long double可AC

另外自环不能加两次

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#define double long double
using namespace std;
const double eps = 1e-9;
int n,m,u[20100],v[20100],w[20100],fir[110],nxt[20100],cnt,d[110];
double a[110][110],ans;
void addedge(int ui,int vi,int wi){
++cnt;
u[cnt]=ui;
v[cnt]=vi;
w[cnt]=wi;
nxt[cnt]=fir[ui];
fir[ui]=cnt;
}
double gauss(void){
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
if(fabs(a[j][i])>eps){
for(int k=1;k<=n+1;k++)
swap(a[i][k],a[j][k]);
// break;
}
}
for(int j=1;j<=n;j++){
if(i==j)
continue;
double rates=a[j][i]/a[i][i];
for(int k=i;k<=n+1;k++)
a[j][k]=a[j][k]-rates*a[i][k];
}
}
return a[1][n+1]/a[1][1];
}
void make(int pos){
memset(a,0,sizeof(a));
a[n][n]=1;
for(int i=1;i<=n-1;i++){
a[i][i]+=d[i];
for(int j=fir[i];j;j=nxt[j]){
if((w[j]>>pos)&1){
a[i][v[j]]+=1;
a[i][n+1]+=1;
}
else{
a[i][v[j]]-=1;
}
}
}
double mid=gauss();
// printf("mid=%lf\n",mid);
ans=(ans+(1<<pos)*mid);
}
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++){
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
addedge(a,b,c),d[a]++;
if(a!=b)
addedge(b,a,c),d[b]++;
}
for(int i=0;i<32;i++){
make(i);
}
printf("%.3Lf\n",ans);
return 0;
}

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

  1. 洛谷P3211 [HNOI2011]XOR和路径(期望dp+高斯消元)

    传送门 高斯消元还是一如既往的难打……板子都背不来……Kelin大佬太强啦 不知道大佬们是怎么发现可以按位考虑贡献,求出每一位是$1$的概率 然后设$f[u]$表示$u->n$的路径上这一位为$ ...

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

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

  3. BZOJ2337: [HNOI2011]XOR和路径

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. JavaScript三种判断语句和三元运算符

    三种判断语句 1.if结构 语法:if(条件){条件满足时执行的代码块} 2.if else结构 语法:if(条件){条件满足时执行的代码块}   else{条件不满足时执行的代码块} 3.if el ...

  2. arm cortex-m0plus源码学习(一)整体框架

    Cortex-M0 分别是系统.电源管理.时钟.复位 由于.cm0p_ik_defs.v里 `define  ARM_CM0PIK_IOP 0,这里的gpio是ahb接口的,画叉的部分没有例化. ah ...

  3. Codeforces 456A - Laptops

    题目链接:http://codeforces.com/problemset/problem/456/A One day Dima and Alex had an argument about the ...

  4. Deprecated: getEntityManager is deprecated since Symfony 2.1

    PHP5.3应用中,登陆后台管理时提示错误: Deprecated: getEntityManager is deprecated since Symfony 2.1. Use getManager  ...

  5. [转载]Oracle ltrim() 函数用法

    前面有说到过LPAD和RPAD这两个函数用法的文章,今天发现与之相反意义的另外两个函数,那就是LTRIM() RTRIM(). 这次就挑LTRIM() 这一函数来讲讲: 具体的语法格式如下: LTRI ...

  6. sql server还原注意事项

    使用Sql Server 2000的数据库备份文件还原Sql Server 2000的数据库和还原Sql Server 2005的数据库区别:1.在还原至Sql 2000时是必须新建数据库并对其还原, ...

  7. MyEclipse/Eclipse快捷键总结

    MyEclipse/Eclipse快捷键 查找某个方法被谁调用:选中方法名,ctrl+shift+g 通过文件名称查找类或文件:ctrl+shift+r(Open Resource)

  8. pytorch种, 一维Conv1d, 二维Conv2d

    pytorch之nn.Conv1d详解 之前学习pytorch用于文本分类的时候,用到了一维卷积,花了点时间了解其中的原理,看网上也没有详细解释的博客,所以就记录一下. Conv1dclass tor ...

  9. jQuery输入框回车添加标签特效

    效果如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...

  10. git获取一个版本相对于另一个版本新增,修改,删除的文件

    git diff --name-status 00ef237ef0f0a4b8bd9609c2b6d570472028212d abf13b4d58abbb05a7d494cdc205d025978a ...