博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ】2337: [HNOI2011]XOR和路径 期望+高斯消元
阅读量:6432 次
发布时间:2019-06-23

本文共 1444 字,大约阅读时间需要 4 分钟。

【题意】给定n个点m条边的带边权无向连通图(有重边和自环),在每个点随机向周围走一步,求1到n的期望路径异或值。n<=100,wi<=10^9。

【算法】期望+高斯消元

【题解】首先异或不满足期望的线性,所以考虑拆位。

对于每一个二进制位,经过边权为0仍是x,经过边权为1变成1-x(转化成减法才满足期望的线性)。

设f[x]表示点x到n的路径xor期望,f[n]=0,根据全期望公式:

$$f[i]=\sum_{j}\frac{f[j]}{out[i]}\ \ , \ \ w(i,j)=0$$

$$f[i]=\sum_{j}\frac{1-f[j]}{out[i]}\ \ , \ \ w(i,j)=1$$

因为有循环所以用高斯消元求解,复杂度O(n^3*log wi)。

#include
#include
#include
#include
using namespace std;const int maxn=110;struct edge{
int v,w,from;}e[maxn*maxn*2];int n,m,first[maxn],tot,out[maxn];long double a[maxn][maxn],ans;void insert(int u,int v,int w){tot++;e[tot].v=v;e[tot].w=w;e[tot].from=first[u];first[u]=tot;out[u]++;}void gauss(){ for(int i=1;i
fabs(a[r][i]))r=j; if(r!=i)for(int j=i;j<=n+1;j++)swap(a[i][j],a[r][j]); for(int j=i+1;j<=n;j++) for(int k=n+1;k>=i;k--) a[j][k]-=a[j][i]/a[i][i]*a[i][k]; } for(int i=n;i>=1;i--){ for(int j=i+1;j<=n;j++)a[i][n+1]-=a[i][j]*a[j][n+1]; a[i][n+1]/=a[i][i]; }}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ int u,v,w; scanf("%d%d%d",&u,&v,&w); insert(u,v,w); if(u!=v)insert(v,u,w);// } for(int k=0;k<=30;k++){ memset(a,0,sizeof(a));// for(int x=1;x
View Code

 

注意:

1.方程组右边是常数项。

2.自环不要重复加边。

转载于:https://www.cnblogs.com/onioncyc/p/7223051.html

你可能感兴趣的文章
三角插值的 Fourier 系数推导
查看>>
05 面向对象之:类的成员
查看>>
PL/SQL程序设计 第五章 异常错误处理
查看>>
Practise Site Home Sample Page Codes de carte cadeau Amazon | Codes Promo Amazon
查看>>
hasattr getattr setattr
查看>>
string类的用法总结
查看>>
mysql 查询优化~ 分页优化讲解
查看>>
机器学习入门
查看>>
[java] 数据处理
查看>>
SEGGER RTT STOP/SLEEP 模式下使用
查看>>
Crusher Django 学习笔记2 基本url配置
查看>>
jQuery ui widget和jQuery plugin的实现原理简单比较
查看>>
DataTables如何重新加载数据
查看>>
ORA-12547:TNS:lost contact 问题分析思路
查看>>
从零开始学习Sencha Touch MVC应用之十一
查看>>
NYOJ148fibonacci数列(二)
查看>>
spring4 定时任务
查看>>
javascript中 for循环的一些写法 for length 以及for in 还有 for of 的区别
查看>>
java读取properties文件的几种方法
查看>>
Android初步-HelloWorld
查看>>