0%

图上行走

给出一个有向无环的连通图,起点为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 raw
1
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;
}