【题目链接】
【思路要点】
- 补档博客,无题解。
【代码】
#include<bits/stdc++.h> using namespace std; #define MAXN 500005 #define EPS 1e-12 struct edge {int dest; double p; }; vector <edge> a[MAXN]; unsigned father[MAXN]; int n; double f[MAXN], g[MAXN], p[MAXN]; void work(int pos) { if (pos == 1) g[pos] = 1; else { int fa = a[pos][father[pos]].dest; double tmp = 1 - a[pos][father[pos]].p * (1 - f[pos]); g[pos] = 1 - (1 - g[fa] * f[fa] / tmp) * a[pos][father[pos]].p; } for (unsigned i = 0; i < a[pos].size(); i++) if (i != father[pos]) work(a[pos][i].dest); } void work(int pos, int fa) { f[pos] = 1 - p[pos]; for (unsigned i = 0; i < a[pos].size(); i++) if (a[pos][i].dest == fa) father[pos] = i; else { work(a[pos][i].dest, pos); f[pos] *= 1 - a[pos][i].p * (1 - f[a[pos][i].dest]); } } int main() { scanf("%d", &n); for (int i = 1; i < n; i++) { int x, y; double z; scanf("%d%d%lf", &x, &y, &z); z /= 100; if (z == 0) z = EPS; if (z == 1) z -= EPS; a[x].push_back((edge){y, z}); a[y].push_back((edge){x, z}); } for (int i = 1; i <= n; i++) { scanf("%lf", &p[i]); p[i] /= 100; if (p[i] == 0) p[i] = EPS; if (p[i] == 1) p[i] -= EPS; } work(1, 0); father[1] = -1; work(1); double ans = 0; for (int i = 1; i <= n; i++) ans += 1 - f[i] * g[i]; printf("%.6lf\n", ans); return 0; }