#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int n,t,d[6001],h[6001],cnt,head[6001],f[6001][2];
struct Edge
{
int nxt,to,val;
}edge[6001];
void ins(int a,int b)
{
edge[++cnt].nxt=head[a];
edge[cnt].to=b;
head[a]=cnt;
}
void dfs(int x)
{
for(int i=head[x];i;i=edge[i].nxt)
{
int j=edge[i].to;
dfs(j);
f[x][0]+=max(f[j][1],f[j][0]);
f[x][1]+=f[j][0];
}
f[x][1]+=h[x];
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>h[i];
for(int i=1;i<=n;i++)
{
int x,y;
cin>>x>>y;
d[x]++;
if(x!=0&&y!=0)
ins(y,x);
}
for(int i=1;i<=n;i++)
if (d[i]==0)
t=i;
dfs(t);
printf("%d",max(f[t][0],f[t][1]));
}
第五个点wa了