给出一个有向无环的连通图,起点为1终点为N,从1能到达所有点,所有点也都能到达n,每条边都有一个长度。乐乐从起点出发,走向终点。
到达每一个顶点时,如果有K条离开该点的道路,乐乐可以选择任意一条道路离开该点,并且走向每条路的概率都是。1/K
现在乐乐想知道,从起点走到终点的所经过的路径总长度期望是多少?
输入描述:
第一行: 两个整数 N M,代表图中有N个点、M条边。
第二行到第 1+M 行: 每行3个整数 a b c,代表从a到b有一条长度为c的有向边。
N<=100000, M<=2N
输出描述:
从起点到终点路径总长度的期望值,四舍五入保留两位小数。
示例1
输入
4 4
1 2 1
1 3 2
2 3 3
3 4 4
输出
7.00
tushangxingzou.cppview raw1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| #include<bits/stdc++.h> #define M 100005 using namespace std; struct node{ int to,v; }; vector<node>edge[M]; double dp[M]; int n; bool mark[M]; double dfs(int x){ if(x==n)return 0; if(dp[x]>-1.0)return dp[x]; dp[x]=0; for(int i=0;i<edge[x].size();i++){ int y=edge[x][i].to; dp[x]+=edge[x][i].v+dfs(y); } dp[x]/=edge[x].size(); return dp[x]; } int main(){ int m,a,b,c; cin>>n>>m; while(m--){ scanf("%d %d %d",&a,&b,&c); edge[a].push_back((node)<%b,c%>); } for(int i=1;i<=n;i++)dp[i]=-1; double ans=dfs(1); printf("%.2f\n",ans); return 0; }
|