码迷,mamicode.com
首页 > 其他好文 > 详细

【bzoj3036】绿豆蛙的归宿

时间:2016-12-20 21:01:01      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:空间   sample   led   main   期望dp   int   ++   dfs   style   

题目描述

随着新版百度空间的下线,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】绿豆蛙的归宿

标签:空间   sample   led   main   期望dp   int   ++   dfs   style   

原文地址:http://www.cnblogs.com/GXZlegend/p/6204000.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!