/*
分析:
树形DP果题。
2012-09-05
*/
#include"stdio.h" #include"string.h" struct A { int from; int to; int next; }eage[10011]; int tot; int head[6011]; int base[6011]; int hash[6011]; int dp[6011][2]; int MAX(int a,int b) { return a>b?a:b; } void add(int a,int b) { eage[tot].from=a; eage[tot].to=b; eage[tot].next=head[a]; head[a]=tot++; } void dfs(int root) { int j,u; dp[root][0]=0; dp[root][1]=base[root]; for(j=head[root];j!=-1;j=eage[j].next) { u=eage[j].to; dfs(u); dp[root][0]+=MAX(dp[u][0],dp[u][1]); dp[root][1]+=dp[u][0]; } } int main() { int n; int i; int a,b; int t; while(scanf("%d",&n)!=-1) { for(i=1;i<=n;i++) scanf("%d",&base[i]); tot=0; memset(head,-1,sizeof(head)); memset(hash,0,sizeof(hash)); while(scanf("%d%d",&a,&b),a||b) {hash[a]=1;add(b,a);} for(i=1;i<=n;i++) if(!hash[i]) {t=i;break;} memset(dp,0,sizeof(dp)); dfs(t); printf("%d\n",MAX(dp[t][0],dp[t][1])); } return 0; }