#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 500005
#define eps 1e-7
using namespace std;

struct node{
    int v,nxt,w;
}e[M<<1];
int num,n,m;
int a[M],head[M],deep[M];
double h[M];
double ans;

inline int read(){
    char c=getchar();
    int x=0;
    while(c<'0'||c>'9') c=getchar();
    while(c>='0'&&c<='9')
      x=(x<<3)+(x<<1)+c-48,c=getchar();
    return x;
}

inline void add_edge(int x,int y,int z){
    e[++num].v=y;
    e[num].nxt=head[x];
    e[num].w=z;
    head[x]=num;
}

void dfs(int x){
    for(int i=head[x];i;i=e[i].nxt)
    if(!deep[e[i].v]){
        deep[e[i].v]=deep[x]+1;
        dfs(e[i].v);
        double k=h[e[i].v]*double(e[i].w)/100;
        h[x]=h[x]+k-h[x]*k;
    }
}

inline int check(double aa,double bb){
    if(aa+eps>bb&&aa-eps<bb) return 1;
    return 0;
}

void redfs(int x){
    ans+=h[x];
    for(int i=head[x];i;i=e[i].nxt)
    if(deep[e[i].v]>deep[x]){
        if(check(h[e[i].v]*double(e[i].w)/100,1)){
            redfs(e[i].v);
            continue;
        }
        double k=(h[x]-h[e[i].v]*double(e[i].w)/100)/(1-h[e[i].v]*double(e[i].w)/100);
        k*=double(e[i].w)/100;
        h[e[i].v]=h[e[i].v]+k-k*h[e[i].v];
        redfs(e[i].v);
    }
}

int main(){
    n=read();
    int x,y,z;
    for(int i=1;i<n;i++){
        x=read();
        y=read();
        z=read();
        add_edge(x,y,z),add_edge(y,x,z);
    }
    for(int i=1;i<=n;i++)
        a[i]=read(),h[i]=a[i]*0.01;
    deep[1]=1;
    dfs(1);
    redfs(1);
    printf("%.6lf",ans);
    return 0;
}

 

0 0 votes
文章评分
订阅这个评论
提醒

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

0 评论
最旧
最新 得票最多
Inline Feedbacks
View all comments