描述 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\n",f[1]); 92 93 return 0; 94 95 }
时间: 2024-10-14 02:00:48