蒟蒻的自我拯救。。。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
#define maxn 11000
struct node
{
int u,v;
}g[maxn];
int p[maxn],next[maxn],val[maxn],n;
int num,vis[maxn];
long long dp[maxn][2];
void dfs(int root)
{
dp[root][0]=0;
dp[root][1]=val[root];
for(int i=p[root];i;i=next[i])
{
dfs(g[i].v);
dp[root][0]+=max(dp[g[i].v][1],dp[g[i].v][0]);
dp[root][1]+=dp[g[i].v][0];
}
}
void build(int a,int b)
{
num++;
g[num].u=b;
g[num].v=a;
next[num]=p[b];
p[b]=num;
}
int main()
{
int a,b;
while(~scanf("%d",&n))
{
num=0;
memset(dp,0,sizeof(dp));
memset(p,0,sizeof(p));
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
scanf("%d",&val[i]);
while(scanf("%d%d",&a,&b))
{
if(a+b==0)
break;
build(a,b);
vis[a]=1;
}
int rt;
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
rt=i;
break;
}
}
dfs(rt);
printf("%lld\n",max(dp[rt][0],dp[rt][1]));
}
return 0;
}