dp[i][0]=Σmax(dp[son][0],dp[son][1]) ;父節點不取,則取全部兒子節點取或不取的之和的最大值,兒子節點不取是由於爲負數
dp[i][1]=a[i] + Σdp[son][0] ;父節點取,則加上全部兒子節點不取的之和
最終結果就是max{dp[root][0],dp[root][1]}
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <vector>
#define ll long long
using namespace std;
int n,a[6005],x,y,vis[6005],dp[6005][2],root;
vector<int> v[6005];
void dfs(int x)
{
dp[x][0]=0;
dp[x][1]=a[x];
for(int i=0;i<v[x].size();i++)
{
int y=v[x][i];
dfs(y);
dp[x][0]+=max(dp[y][0],dp[y][1]);
dp[x][1]+=dp[y][0];
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
while(cin >> n)
{
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
v[i].clear();
for(int i=1;i<=n;i++)
cin >> a[i];
while(cin >> x >> y,x||y)
{
v[y].push_back(x);
vis[x]=1;
}
for(int i=1;i<=n;i++)
{
if(vis[i]==0)
{
root=i;
break;
}
}
dfs(root);
cout << max(dp[root][0],dp[root][1]) << endl;
}
return 0;
}