「Poetize3」绿豆蛙的归宿

描述 Description
给出一个有向无环图,起点为1终点为N,每条边都有一个长度,并且从起点出发能够到达所有的点,所有的点也都能够到达终点。绿豆蛙从起点出发,走向终点。
到达每一个顶点时,如果有K条离开该点的道路,绿豆蛙可以选择任意一条道路离开该点,并且走向每条路的概率为 1/K 。
现在绿豆蛙想知道,从起点走到终点的所经过的路径总长度期望是多少?
题解:
这种期望DP一般从终点开始倒推。
所以这道题既可以dfs,也可以写反向边的拓扑排序。
代码:
 1 #include<cstdio>
 2 
 3 #include<cstdlib>
 4 
 5 #include<cmath>
 6 
 7 #include<cstring>
 8 
 9 #include<algorithm>
10 
11 #include<iostream>
12 
13 #include<vector>
14 
15 #include<map>
16 
17 #include<set>
18 
19 #include<queue>
20 
21 #include<string>
22 
23 #define inf 1000000000
24 
25 #define maxn 200000
26 
27 #define maxm 500+100
28 
29 #define eps 1e-10
30 
31 #define ll long long
32 
33 #define pa pair<int,int>
34 
35 #define for0(i,n) for(int i=0;i<=(n);i++)
36 
37 #define for1(i,n) for(int i=1;i<=(n);i++)
38 
39 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
40 
41 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
42 
43 #define mod 1000000007
44 
45 using namespace std;
46 
47 inline int read()
48 
49 {
50 
51     int x=0,f=1;char ch=getchar();
52 
53     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
54 
55     while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();}
56 
57     return x*f;
58 
59 }
60 struct edge{int go,next,w;}e[2*maxn];
61 int n,m,head[maxn];
62 double f[maxn];
63 bool v[maxn];
64 void dfs(int x)
65 {
66     if(v[x])return;v[x]=1;
67     int cnt=0;
68     for(int i=head[x],y;i;i=e[i].next)
69     {
70         cnt++;
71         dfs(y=e[i].go);
72         f[x]+=f[y]+e[i].w;
73     }
74     if(cnt)f[x]/=cnt;
75 }
76 
77 int main()
78 
79 {
80 
81     freopen("input.txt","r",stdin);
82 
83     freopen("output.txt","w",stdout);
84 
85     n=read();m=read();
86     for1(i,m)
87      {
88         int x=read();e[i].go=read();e[i].next=head[x];head[x]=i;e[i].w=read();
89      }
90     dfs(1);
91     printf("%.2lf
",f[1]);
92 
93     return 0;
94 
95 }
View Code
原文地址:https://www.cnblogs.com/zyfzyf/p/4041026.html