【题目链接】
【思路要点】
- 补档博客,无题解。
【代码】
#include<bits/stdc++.h> using namespace std; #define MAXN 100005 struct edge {int dest, len; }; vector <edge> a[MAXN]; int n, m, d[MAXN], o[MAXN], q[MAXN], tot; double ans[MAXN], p[MAXN]; int main() { scanf("%d%d", &n, &m); for (int i = 1; i <= m; i++) { int x, y, z; scanf("%d%d%d", &x, &y, &z); d[y]++; o[x]++; a[x].push_back((edge){y, z}); } for (int i = 1; i <= n; i++) if (d[i] == 0) q[++tot] = i; ans[1] = 0; p[1] = 1; for (int i = 1; i <= tot; i++) { int tmp = q[i]; for (unsigned j = 0; j < a[tmp].size(); j++) { d[a[tmp][j].dest]--; if (d[a[tmp][j].dest] == 0) q[++tot] = a[tmp][j].dest; p[a[tmp][j].dest] += p[tmp] / o[tmp]; ans[a[tmp][j].dest] += (ans[tmp] + a[tmp][j].len * p[tmp]) / o[tmp]; } } printf("%.2lf\n", ans[n]); return 0; }