code:
#include<iostream>
#include<math.h>
using namespace std;
const int N=6e3+10;
int n,l,k,dp[N][5];
int top,head[N];
bool vis[N],dep[N];
struct edge{int nxt,v;}eg[N];
void build(int u,int v){eg[++top].v=v,eg[top].nxt=head[u],head[u]=top;}
int read(){
int x=0,f=1;char c=getchar();
while(c<'0' || c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0' && c<='9') x=x*10+c-'0',c=getchar();
return f==1?x:-x;
}
void solves(int u){
vis[u]=1;
for(int i=head[u];i;i=eg[i].nxt){
int v=eg[i].v;if(vis[v]) continue;
solves(v);dp[u][1]+=dp[v][0];
dp[u][0]=max(dp[v][0],dp[v][1]);
}
}
int main(){
n=read();
for(int i=1;i<=n;i++) dp[i][1]=read();
for(int i=1;i<n;i++) l=read(),k=read(),dep[l]=1,build(k,l);
for(int i=1;i<=n;i++){
if(!dep[i]){
solves(i);
printf("%d",max(dp[i][0],dp[i][1]));
return 0;
}
}
return 0;
}