首页 > 代码库 > 【bzoj3036】绿豆蛙的归宿
【bzoj3036】绿豆蛙的归宿
题目描述
随着新版百度空间的下线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿。
给出一个有向无环的连通图,起点为1终点为N,每条边都有一个长度。绿豆蛙从起点出发,走向终点。
到达每一个顶点时,如果有K条离开该点的道路,绿豆蛙可以选择任意一条道路离开该点,并且走向每条路的概率为 1/K 。
现在绿豆蛙想知道,从起点走到终点的所经过的路径总长度期望是多少?
输入
第一行: 两个整数 N M,代表图中有N个点、M条边
第二行到第 1+M 行: 每行3个整数 a b c,代表从a到b有一条长度为c的有向边
输出
从起点到终点路径总长度的期望值,四舍五入保留两位小数。
样例输入
4 4
1 2 1
1 3 2
2 3 3
3 4 4
样例输出
7.00
提示
对于100%的数据 N<=100000,M<=2*N
题解
期望dp水题一道。
f[i]表示从i到n的期望长度(有向无环连通图)。
小心除零。
1 #include <cstdio> 2 #define N 100001 3 int head[N] , to[N << 2] , val[N << 2] , next[N << 2] , cnt , out[N] , vis[N]; 4 double f[N]; 5 void add(int x , int y , int z) 6 { 7 to[++cnt] = y; 8 val[cnt] = z; 9 next[cnt] = head[x]; 10 head[x] = cnt; 11 } 12 void dfs(int x) 13 { 14 if(vis[x]) 15 return; 16 vis[x] = 1; 17 int i; 18 for(i = head[x] ; i ; i = next[i]) 19 { 20 dfs(to[i]); 21 f[x] += f[to[i]] + val[i]; 22 } 23 if(out[x]) 24 f[x] /= out[x]; 25 } 26 int main() 27 { 28 int n , m , x , y , z; 29 scanf("%d%d" , &n , &m); 30 while(m -- ) 31 { 32 scanf("%d%d%d" , &x , &y , &z); 33 add(x , y , z); 34 out[x] ++ ; 35 } 36 dfs(1); 37 printf("%.2lf\n" , f[1]); 38 return 0; 39 }
【bzoj3036】绿豆蛙的归宿
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。