解题思路:要求所有的期望,就要求出每个走每个路线的概率乘以路线的长度, 每条线的概率就是每个点的概率再除以出度。直接累加就可以。要计算每个点的概率就要遍历所有的入度。也就是说入度为零的时候这个点的所有概率都算上了,也就可以计算了。因此拓扑一下就可以。
AC代码:
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
struct Path
{
int n, len;
} pa;
vector<Path> vt[100005];
queue<int> que;
int rd[100005];
double P[100005];
double solve()
{
que.push(1);
P[1] = 1.0;
double ans = 0;
while(!que.empty())
{
int v = que.front(); que.pop();
int len = vt[v].size();
double pp = P[v] * 1.0 / len;
for(int i=0; i<len; i++)
{
int x = vt[v][i].n;
P[x] += pp;
ans += pp * 1.0 * vt[v][i].len;
rd[x]--;
if(!rd[x]) que.push(x);
}
}
return ans;
}
int main()
{
int n, m;
int a;
scanf("%d%d", &n, &m);
for(int i=0; i<m; i++)
{
scanf("%d%d%d", &a, &pa.n, &pa.len);
vt[a].push_back(pa);
rd[pa.n]++;
}
printf("%.2f\n",solve() );
return 0;
}