rt,知道自己有undefined behavior但是检查不出来.望大佬帮助。
#include <cstdio>
#include <vector>
#include <algorithm>
#pragma GCC optimize(2)
#define db double
#define fo(i, a, b) for(int i = (a); i <= (b); ++i)
#define fd(i, a, b) for(int i = (a); i >= (b); --i)
#define fv(i, _v) for(int i = 0, siz = _v.size(); i < siz; ++i)
using namespace std;
inline int read() {// negative , long long
int x = 0; char ch = getchar();
while(ch < '0' || ch > '9') ch = getchar();
while(ch >= '0' && ch <= '9') x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar();
return x;
}
const int N = 5e5;
struct To {
int v; db w;
To(){}
To(int _v, db _w){v = _v, w = _w;}
};
vector<To> G[N + 3];
int n, q[N], fa[N];
db ans, p[N + 3], pref[N + 3], val[N + 3], f[N + 3], g[N + 3];
inline db calc(db p, db q){return 1 - (1 - p) * (1 - q);}
void bfs() {
q[1] = 1;
for(int h = 1, t = 1; h <= t; ++h) {
int u = q[h];
for(vector<To>::iterator it = G[u].begin(); it != G[u].end(); )
if(it -> v ^ fa[u])
fa[it -> v] = u, q[++t] = it -> v, ++it;
else it = G[u].erase(it);
}
fd(i, n, 1) {
int u = q[i];
fv(i, G[u]) f[u] = calc(f[u], G[u][i].w * f[G[u][i].v]);
}
fo(i, 1, n) {
int u = q[i];
if(!G[u].size()) continue ;
fv(i, G[u])
pref[i + 1] = calc(pref[i], f[G[u][i].v] * G[u][i].w), g[G[u][i].v] = calc(g[u], p[u]);
db suff = 0;
for(int i = G[u].size() - 1; ~i; --i)
g[G[u][i].v] = calc(g[G[u][i].v], calc(pref[i], suff)) * G[u][i].w, suff = calc(suff, f[G[u][i].v] * G[u][i].w);
}
}
int main() {
// freopen("charger.in", "r", stdin);
// freopen("charger.out", "w", stdout);
n = read();
int u, v, w;
fo(i, 2, n) u = read(), v = read(), w = read(), G[u].push_back(To(v, w * 0.01)), G[v].push_back(To(u, w * 0.01));
fo(i, 1, n) f[i] = p[i] = read() * 0.01;
bfs();
fo(i, 1, n) ans += calc(f[i], g[i]);
printf("%.6lf", ans);
return 0;
}