嘟嘟嘟

一看到异或,就想到按位处理.
当处理到第\(i\)位的时候,\(f[u]\)表示节点\(u\)到\(n\)的路径,这一位为\(1\)的期望,那么为\(0\)就是\(1 - f[u]\),于是有
\[f[u] = \frac{1}{d[u]} (\sum _ {v \in V, w = 0} f[v] + \sum _ {v \in V, w = 1} 1 - f[v])\]
因为是异或,所以如果边权这一位是0的话,应该加上\(f[v]\);否则加上\(1 - f[v]\)。
然后整理一下
\[d[u] * f[u] - \sum _ {v \in V, w = 0} f[v] + \sum _ {v \in V, w = 1} f[v] = \sum _ {v \in V, w = 1} 1\]
于是就可以高斯消元了。
答案为\(\sum 2 ^ i * ans_i[1]\)。

需要注意的是,重边只应该加一次,对应的度数也应该只加\(1\)。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
#define enter puts("")
#define space putchar(' ')
#define Mem(a, x) memset(a, x, sizeof(a))
#define rg register
typedef long long ll;
typedef double db;
const int INF = 0x3f3f3f3f;
const db eps = 1e-8;
const int maxn = 105;
const int maxe = 2e4 + 5;
inline ll read()
{ll ans = 0;char ch = getchar(), last = ' ';while(!isdigit(ch)) last = ch, ch = getchar();while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();if(last == '-') ans = -ans;return ans;
}
inline void write(ll x)
{if(x < 0) x = -x, putchar('-');if(x >= 10) write(x / 10);putchar(x % 10 + '0');
}int n, m, Max = 0;
int du[maxn];
struct Edge
{int nxt, to, w;
}e[maxe];
int head[maxn], ecnt = -1;
void addEdge(int x, int y, int w)
{e[++ecnt] = (Edge){head[x], y, w};head[x] = ecnt;
}db f[maxn][maxn], ans[maxn], Ans = 0;
void build(int x)
{Mem(f, 0);for(int i = 1; i < n; ++i)  //小于n{f[i][i] = du[i];for(int j = head[i]; j != -1; j = e[j].nxt)if((e[j].w >> x) & 1) ++f[i][e[j].to], ++f[i][n + 1];else --f[i][e[j].to];}
}
db Gauss()
{for(int i = 1; i <= n; ++i){int pos = i;for(int j = i + 1; j <= n; ++j)if(fabs(f[j][i]) > fabs(f[pos][i])) pos = j;if(pos != i) swap(f[i], f[pos]);db tp = f[i][i];if(fabs(tp) > eps) for(int j = i; j <= n + 1; ++j) f[i][j] /= tp;for(int j = i + 1; j <= n; ++j){db tp = f[j][i];for(int k = i; k <= n + 1; ++k) f[j][k] -= tp * f[i][k];}}for(int i = n; i; --i){ans[i] = f[i][n + 1];for(int j = i - 1; j; --j) f[j][n + 1] -= f[j][i] * f[i][n + 1];}return ans[1];
}int main()
{Mem(head, -1);n = read(); m = read();for(int i = 1; i <= m; ++i){int x = read(), y = read(), w = read();addEdge(x, y, w); ++du[x];if(x ^ y) addEdge(y, x, w), ++du[y];Max = max(Max, w);}for(int i = 0; (1 << i) <= Max; ++i)build(i), Ans += Gauss() * (1 << i);printf("%.3lf\n", Ans);return 0;
}

转载于:https://www.cnblogs.com/mrclr/p/10137454.html

[HNOI2011]XOR和路径相关推荐

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

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

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

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

  3. Bzoj2337:[HNOI2011]XOR和路径

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

  4. bzoj2337: [HNOI2011]XOR和路径

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

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

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

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

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

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

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

  8. [HNOI 2011]XOR和路径

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

  9. 洛谷 P4151 BZOJ 2115 [WC2011]最大XOR和路径

    //bzoj上的题面太丑了,导致VJ的题面也很丑,于是这题用洛谷的题面 题面描述 XOR(异或)是一种二元逻辑运算,其运算结果当且仅当两个输入的布尔值不相等时才为真,否则为假. XOR 运算的真值表如 ...

最新文章

  1. overridePendingTransition 方法在Fragment 中使用
  2. r语言remarkdown展示图_使用R语言包circlize可视化展示blast双序列比对结果
  3. 超级详细的 Python 数据分析指南
  4. CSS布局之品字布局
  5. IDEA创建Web项目及部署Tomcat
  6. 吴恩达入驻知乎,涨粉秒过万!知乎首答:如何系统学习机器学习
  7. 经济学原理 下载 曼昆_2021南开经济学考研全年规划
  8. python图层合并_Ps算法Python实现:图层混合模式-色相
  9. oracle11 登陆慢,oracle11g安装后电脑启动很慢怎么解决
  10. [ZJOI2005]午餐
  11. springBoot笔记(一) @SpringBootApplication的神奇魔力
  12. matlab符号运算ppt,第5 章Matlab符号运算.ppt
  13. logcat日志分析
  14. Dubbo之手写RPC框架
  15. 计算机控制的仓库定位系统,(边江文档教材)智能立体仓库物品定位的plc自动控制系统.doc...
  16. Alpha测试与Beta测试
  17. 史上最全最详细的PS3模拟器安装及设置教程
  18. 【Python】pass,continue和break的区别
  19. 已拿 offer!一个非 985/211 的普通二本学生从毕业季到职场的面经分享!
  20. java交换机状态_博科SAN交换机的状态等信息查询(华为SNS系列交换机为例OEM博科)...

热门文章

  1. 去除list集合中重复项的几种方法
  2. HTTP基本认证(Basic Authentication)的JAVA示例
  3. 九度oj 题目1380:lucky number
  4. [再寄小读者之数学篇](2014-04-22 平方差公式在矩阵中的表达)
  5. 一个经典实例理解继承与多态原理与优点(附源码)---面向对象继承和多态性理解得不够深刻的同学请进...
  6. ComponentOne FlexGrid for WinForms 中文版快速入门(9)—过滤
  7. PHP array_count_values() 函数用于统计数组中所有值出现的次数。
  8. 认证考试介绍之RHCE篇
  9. 使用.NET Remoting开发分布式应用——基于租约的生存期(转载)
  10. html5包含inc文件,HTML中include file标签的用法