思路

看到异或,容易联想到二进制位之间是相互独立的,所以可以把问题变成每个二进制位为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;
}

转载于:https://www.cnblogs.com/dreagonm/p/10527692.html

P3211 [HNOI2011]XOR和路径相关推荐

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

    传送门 首先,异或的话直接讨论不好讨论,那么我们可以按位讨论,对于每一位讨论出来一个结果,然后将结果相加就好了. 然后考虑怎么讨论一位上的结果. 我们可以设出来一个dp方程:f(i)表示i到n的异或和 ...

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

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

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

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

  4. Bzoj2337:[HNOI2011]XOR和路径

    题面 bzoj Sol 设\(f[i]\)表示\(i到n\)的路径权值某一位为\(1\)的期望 枚举每一位,高斯消元即可 不要问我为什么是\(i\ - \ n\)而不可以是\(1\ - \ i\) # ...

  5. bzoj2337: [HNOI2011]XOR和路径

    传送门:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2337 思路:看到异或,那就按位做. 假设现在在做第i位,为了描述方便,现在的边权是v ...

  6. YBROJ洛谷P3211:XOR和路径(线性基,期望dp)

    解析 不难想到第一步利用期望线性性逐位考虑. 然后就变成求一个布尔变量的期望了,可以直接转化为求概率. 我一开始的想求从1出发异或和为0/1的概率,然而这个东西在原点1附近的转移特别别扭-老出现概率大 ...

  7. [HNOI2011]XOR和路径

    嘟嘟嘟 一看到异或,就想到按位处理. 当处理到第\(i\)位的时候,\(f[u]\)表示节点\(u\)到\(n\)的路径,这一位为\(1\)的期望,那么为\(0\)就是\(1 - f[u]\),于是有 ...

  8. P4151 [WC2011]最大XOR和路径(线性基应用)

    P4151 [WC2011]最大XOR和路径 思路 如果单纯的只是树形图,那么答案显然易见只有一种,也就是从头到尾的路径从头到尾的异或值,但是这里不同的就是有可能在道路上有许多的环. 题目有一个重点提 ...

  9. P4151 [WC2011]最大XOR和路径(线性基)

    P4151 [WC2011]最大XOR和路径 对于求解最大异或和路径,首先边可以重复走,最终的结果一定是一条路径和许多环的异或和,因为路径和环之间的边会被走两次,不会被计算,所以我们可以通过dfs树求 ...

  10. [HNOI 2011]XOR和路径

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

最新文章

  1. CenTos6.8安装Heartbeat
  2. etcd 访问 锁_在系统中用etcd实现服务注册和发现
  3. java生成随机数保留数点后两位
  4. Xargs用法详解(原创)
  5. mysql in or索引失效_in 索引失效的问题
  6. Android UI开发第二十九篇——Android中五种常用的menu(菜单)
  7. matlab的m函数入门1
  8. BootstrapTable自定义ajax方法
  9. linux中不同版本的gcc切换,Ubuntu 14.04中升级gcc到版本4.9.2并切换使用它们
  10. 如何让火狐浏览器兼容window.event
  11. MATLAB设置当前工作目录
  12. 向张小龙开炮!百度祭出智能小程序
  13. “小心!有人在偷看你手机!”谷歌搞了个被偷窥提醒算法
  14. c++画函数图像_二次函数图像与系数a,b,c的关系
  15. form表单问题记录
  16. 计算广告(五):搜索与竞价广告
  17. 微信JS接口安全域名填写ip地址
  18. mysql57免安装教程_mysql5.7免安装版配置教程
  19. 【PostgresSQL】生成当前时间以及当前时间戳
  20. Java OOM问题分析 学习

热门文章

  1. RenderSettings 渲染设置
  2. Javascript中的Math.max()和Math.min()
  3. 软件体系架构课下作业01
  4. OllyDbg 使用注意事项 (十)
  5. MSSQL数据库管理---索引
  6. iOS .xib文件 添加点击事件 及 点击不响应 注意点
  7. 牛客多校第六场G Is Today Friday?(吉姆拉尔森/蔡勒公式 + 思维)题解
  8. greenplum数据库建表及分区
  9. Json概述以及python对json的相关操作
  10. 深入Managed DirectX9(十五)