人傻了,第一次看到数数题对拍过了交上去不过的
处理了除 0 的情况
#include<bits/stdc++.h>
#define file_in(x) (freopen(#x".in","r",stdin))
#define file_out(x) (freopen(#x".out","w",stdout))
using namespace std;
typedef double db;
template<class type> type read(type ret=0,int w=0,char ch=getchar()){
while(!isdigit(ch)) w=ch=='-',ch=getchar();
while(isdigit(ch)) ret=ret*10+ch-'0',ch=getchar();
return w?-ret:ret;
}
const int N=5e5+5;
const db eps=1e-9;
int n,head[N],cntedg=1,c[N];
db p[N],f[N],g[N],h[N],ans;
struct edge{int to,nxt;db w;}edg[N<<1];
void add(int u,int v,db w){edg[++cntedg]={v,head[u],w},head[u]=cntedg;}
void dfs1(int u,int fa=0){
f[u]=h[u]=1-p[u];
for(int i=head[u];i;i=edg[i].nxt){
int v=edg[i].to;db w=edg[i].w;
if(v==fa) continue;
dfs1(v,u);
f[u]*=1+f[v]*w-w;
f[v]<=eps&&1-w<=eps?++c[u]:h[u]*=1+f[v]*w-w;
}
}
void dfs2(int u,int fa=0){
if(!fa) g[u]=1;
for(int i=head[u];i;i=edg[i].nxt){
int v=edg[i].to;db w=edg[i].w,tmp;
if(v==fa) continue;
tmp=g[u]*(f[v]<=eps&&1-w<=eps?c[u]==1?h[u]:0:f[u]/(1+f[v]*w-w));
g[v]=1+tmp*w-w;
dfs2(v,u);
}
}
signed main(){
file_in(data),file_out(P4284);
n=read<int>();
for(int i=1;i<n;++i){
int u=read<int>(),v=read<int>(),w=read<int>();
add(u,v,w*0.01);
}
for(int i=1;i<=n;++i) p[i]=read<int>()*0.01;
dfs1(1),dfs2(1);
for(int i=1;i<=n;++i) ans+=1-f[i]*g[i];
printf("%.6lf\n",ans);
return 0;
}
//~kawaii~