题目大意:

每条路径上有一个距离值,从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. Linux系统结构与终端控制台

    Linux系统结构与终端控制台 作者:Vashon 时间:20150418 以下主要是对Linux系统终端控制台切换及基本操作的范例,其他的理论就不多说了,直接进入实践部分. Starting.... ...

  2. 写给技术lead的招聘指南

    工作这么久,面试过的工程师不下两三百人.大部份招到的人都比靠谱当然也有失败的例子.把亲身经历总结如下: 1. 什么人一定不能招: 理解能力差: 对你提出的问题,答不对题,重复提问.面试官可以在面试当中 ...

  3. Django请求,响应,ajax以及CSRF问题

    二.request对象常用属性: Attribute Description path 请求页面的全路径,不包括域名端口参数.例如: /users/index method 一个全大写的字符串,表示请 ...

  4. 超不清视频播放器-用Python将视频转成字符

    前言 今天分享的这段代码,看起来没啥实际用处,而且有些反潮流,因为现如今大家看视频都追求更高分辨率的超清画质,而我们这个,是一个“超不清”的视频播放器:在控制台里播放视频,用字符来表示画面 不过我觉得 ...

  5. navicat 链接数据库查看的工具 可以同时查看各种数据库 MySql SqlServer

    navicat 链接数据库查看的工具 Navicat_Premium_10.0.11.0_XiaZaiBa

  6. Hadoop-01 搭建hadoop伪分布式运行环境

    Linux中配置Hadoop运行环境 程序清单 VMware Workstation 11.0.0 build-2305329 centos6.5 64bit jdk-7u80-linux-x64.r ...

  7. 在windows下.NET CORE 与Consul简单使用

    0)基本概念 consul常用于服务发现 [微服务] web_Api \ \   ->注册服务                                          raft选举le ...

  8. Python---哈夫曼树---Huffman Tree

    今天要讲的是天才哈夫曼的哈夫曼编码,这是树形数据结构的一个典型应用. !!!敲黑板!!!哈夫曼树的构建以及编码方式将是我们的学习重点. 老方式,代码+解释,手把手教你Python完成哈夫曼编码的全过程 ...

  9. HTTP请求头的具体含意

    为你详细解读HTTP请求头的具体含意 | 浏览:5763 | 更新:2012-03-16 16:41 当我们打开一个网页时,浏览器要向网站服务器发送一个HTTP请求头,然后网站服务器根据HTTP请求头 ...

  10. 函数内部属性之arguments和this

    在函数内部,有两个特殊的对象:arguments和this. 1.arguments arguments是一个类数组对象.包含着传入函数中的所有参数.但这个对象还有一个名叫callee的属性,该属性是 ...