题目大意:

每条路径上有一个距离值,从1走到N可以得到一个所有经过路径的异或和,求这个异或和的数学期望

这道题直接去求数学期望的DP会导致很难列出多元方程组

我们可以考虑每一个二进制位从1走到N的平均概率值

因为整个图是联通的那么所有点都默认会处于多元方程组中

Pi = p[i] * sigma( v&d[i][j]?(1-Pj):Pj)

v是当前二进制位代表的数值

这里需要注意的是自环的加边情况,自环只加一次边,不能向平时那样加无向边一样

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
const int N = ;
const int M = ;
#define eps 1e-8
int first[N] , k , degree[N] , n , m;
double p[N] , a[N][N]; void debug()
{
for(int i= ; i<n ; i++){
for(int j= ; j<=n ; j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
} struct Edge{
int y , next , d;
Edge(int y= , int next= , int d=):y(y),next(next),d(d){}
}e[M<<]; void add_edge(int x,int y,int d)
{
e[k] = Edge(y , first[x] , d);
first[x] = k++;
} int get_width(int x)
{
int ret = ;
while(x)
{
x>>=;
ret++;
}
return ret;
} void build(int v)
{
memset(a , , sizeof(a));
for(int i= ; i<n ; i++){
a[i][i] = ;
if(i==n-) continue;
for(int j=first[i] ; ~j ; j=e[j].next){
int u = e[j].y;
if(v&e[j].d){
a[i][u] += p[i];
a[i][n] += p[i];
}else{
a[i][u] -= p[i];
}
}
}
// debug();
} int gauss(int n)
{
int i,j,k;
for(i= , j= ; i<n&&j<n ; j++){
for(k=i ; k<n ; k++)
if(fabs(a[k][j])>eps) break;
if(k<n){
if(i!=k)
for(int r=j ; r<=n ; r++) swap(a[i][r],a[k][r]);
double tt = 1.0/a[i][j];
for(int r=j ; r<=n ; r++) a[i][r] *= tt;
for(int r= ; r<n ; r++){
if(r == i) continue;
for(int t=n ; t>=j ; t--)
a[r][t] -= a[i][t]*a[r][j];
}
i++;
}
}
for(int r=i ; r<n ; r++)
if(fabs(a[r][n])>eps) return ;
return ;
} int main()
{
#ifndef ONLINE_JUDGE
freopen("a.in" , "r" , stdin);
#endif // ONLINE_JUDGE
while(~scanf("%d%d" , &n , &m))
{
memset(first , - , sizeof(first));
memset(degree , , sizeof(degree));
k = ;
int maxn = ;
for(int i= ; i<m ; i++){
int x,y,d;
scanf("%d%d%d" , &x , &y , &d);
add_edge(x-,y-,d);
if(x!=y){
add_edge(y- , x- , d);
degree[x-]++ , degree[y-]++;
}
else degree[x-]++;
maxn = max(maxn , d);
}
for(int i= ; i<n ; i++) p[i] = 1.0/(degree[i]*1.0);//得到从当前点每条边出发的概率
int len = get_width(maxn);
double ret= ;
for(int i= ; i<len ; i++){
int v = <<i;
build(v);
gauss(n);
ret += v*a[][n];
}
printf("%.3f\n" , ret);
}
return ;
}

bzoj 2337 高斯消元+概率DP的更多相关文章

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

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

  2. BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡 [高斯消元 概率DP]

    1778: [Usaco2010 Hol]Dotp 驱逐猪猡 题意:一个炸弹从1出发p/q的概率爆炸,否则等概率走向相邻的点.求在每个点爆炸的概率 高斯消元求不爆炸到达每个点的概率,然后在一个点爆炸就 ...

  3. [luogu2973]driving out the piggies 驱逐猪猡【高斯消元+概率DP】

    看到题面的那一刻,我是绝望的ORZ 图论加概率期望加好像不沾边的高斯消元???我人直接傻掉 还没学过概率期望的我果断向题解屈服了(然后还是傻掉了两节课来找线性方程.. Description 奶牛们建 ...

  4. LightOJ 1151 - Snakes and Ladders 高斯消元+概率DP

    首先来个期望的论文,讲的非常好,里面也提到了使用线性方程组求解,尤其适用于有向图的期望问题. 算法合集之<浅析竞赛中一类数学期望问题的解决方法> http://www.lightoj.co ...

  5. Broken robot CodeForces - 24D (三对角矩阵简化高斯消元+概率dp)

    题意: 有一个N行M列的矩阵,机器人最初位于第i行和第j列.然后,机器人可以在每一步都转到另一个单元.目的是转到最底部(第N个)行.机器人可以停留在当前单元格处,向左移动,向右移动或移动到当前位置下方 ...

  6. UVa 10828 Back to Kernighan-Ritchie 高斯消元+概率DP

    题目来源:UVa 10828 Back to Kernighan-Ritchie 题意:从1開始 每次等概率从一个点到和他相邻的点 有向 走到不能走停止 求停止时每一个点的期望 思路:写出方程消元 方 ...

  7. light oj 1151 - Snakes and Ladders 高斯消元+概率DP

    思路: 在没有梯子与蛇的时候很容易想到如下公式: dp[i]=1+(∑dp[i+j])/6 但是现在有梯子和蛇也是一样的,初始化p[i]=i; 当有梯子或蛇时转移为p[a]=b; 这样方程变为: dp ...

  8. BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡(高斯消元+期望dp)

    传送门 解题思路 设\(f(x)\)表示到\(x\)这个点的期望次数,那么转移方程为\(f(x)=\sum\frac{f(u)*(1 - \frac{p}{q})}{deg(u)}\),其中\(u\) ...

  9. 【BZOJ-3270】博物馆 高斯消元 + 概率期望

    3270: 博物馆 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 292  Solved: 158[Submit][Status][Discuss] ...

随机推荐

  1. Log4net系列一:Log4net搭建之文本格式输出

    Log4net简介 前言 项目开发中,记录项目日志是必须的,如果非要说日志的重要性(日志可看做,飞机的黑匣子,或者汽车的行车记录仪),根据等级进行记录,方便我们排查相关问题,以后项目运维中,也方便很多 ...

  2. CCF|最大波动|Java|100

    import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Sc ...

  3. java.lang.NoSuchMethodError: org.hibernate.cfg.Environment.verifyProperties

    我在使用jpa2+spring4+hibernate4 的时候,报错java.lang.NoSuchMethodError: org.hibernate.cfg.Environment.verifyP ...

  4. http与WebSocket

    利用websocket连接服务器的最大特点就是:持久链接的特点. 共同点是:都是基于TCP协议进行client-server的链接,websocket是HTML5提出的一套补缺HTTP链接中不能持久链 ...

  5. c++正则表达式模板库GRETA的使用

    GRETA是微软研究院的一位前员工开发并开源的一个C++正则表达式库,兼容perl正则语法 官方介绍:“A fast, flexible, perl-compliant regular express ...

  6. 职业生涯手记——电视剧剧情O.O

    很多电视剧.偶像剧.电影里出现过一些场景,从来没想过狗血剧情是来源于现实.. 直到上周一开始,我慢慢相信了.. 事情是这样的. 我们小组有个组员H,从上周一开始他每天都去公司的座机电话接1~2个电话, ...

  7. Android(java)学习笔记184:多媒体之 MediaPlayer使用

    MediaPlayer类可用于控制音频/视频文件或流的播放.关于如何使用这个类的方法还可以阅读VideoView类的文档. 1.MediaPlayer 状态图       对播放音频/视频文件和流的控 ...

  8. python基础一 day9 函数升阶(1)

    函数 可读性强 复用性强def 函数名(): 函数体 return 返回值所有的函数 只定义不调用就一定不执行 先定义后调用 函数名() #不接收返回值返回值 = 函数名() #接收返回值 返回值 没 ...

  9. vs2008控件查看器

    使用 OLE/COM 对象查看器 通过读取控件的类型库,OLE/COM 对象查看器使您得以查看控件的接口. 使用 OLE/COM 对象查看器 单击“工具”菜单上的“OLE/COM 对象查看器”或在命令 ...

  10. 关于mysql服务突然运行不了的问题-“本地计算机上的mysql服务启动后停止,某些...”

    1.将mysql数据库的安装目录bin文件路径添加到环境的path中,为了让cmd可以直接输入下面的相关命令,不然cd到mysql的bin下也可以 2.cmd输入mysqld --initialize ...