并查集
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=3300;
struct Node {
int u,v,w;
Node(){}
Node(int u,int v,int w):u(u),v(v),w(w){}
bool operator<(const Node & th)const {
return w<th.w;
}
}node[N];
int cnt[N];
int fa[N],num[N];
int Find(int u){
if(u==fa[u])return u;
return fa[u]=Find(fa[u]);
}
int main(){
#ifdef DouBi
freopen("in.cpp","r",stdin);
#endif // DouBi
int n;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n-1;i++){
int a,b,c;scanf("%d%d%d",&a,&b,&c);
node[i]=Node(a,b,c);
}
sort(node,node+n-1);
int sum=0;
for(int i=1;i<=n;i++){
scanf("%d",&cnt[i]);
sum+=cnt[i];
}
for(int i=1;i<=n;i++){
fa[i]=i,num[i]=1;
}
int ans=0;
for(int i=0;i<n-1;i++){
int u=node[i].u,v=node[i].v,w=node[i].w;
//printf("%d %d %d\n",u,v,w);
int x=Find(u),y=Find(v);
fa[x]=y;
cnt[y]+=cnt[x];
num[y]+=num[x];
ans=w;
if(sum-cnt[y]<num[y])break;
}
printf("%d\n",ans);
}
return 0;
}