1 /*
2 http://acm.hdu.edu.cn/showproblem.php?pid=1520
3 题意:每个人都有一个开心值,除了root,每个人都有一个直接上级领导.校长要让存在直接领导与被领导关系的人不同时来party;
4 要求来的人开心值和最大可以是多少;
5 思路:dp[leaf][1]代表i来的最大值,dp[leaf][0]代表i不来的最大值,
6 dp[root][1]就是所有leaf不来的最大值和加上root的开心值;
7 dp[root][0]就是所有leaf来或不来的最大值的和;
8 最后输出root来或不来的最大值;
9 2017年02月25日08:49:54
10 */
11 #include <cstdio>
12 #include <vector>
13 #include <algorithm>
14 #include <cstring>
15 using namespace std;
16 int dp[6010][2]={0};
17 vector<int> a[6010];
18 void dfs(int root){
19 for(int i=0;i<a[root].size();i++){
20 dfs(a[root][i]);
21 dp[root][1]+=dp[a[root][i]][0];
22 dp[root][0]+=max(dp[a[root][i]][0],dp[a[root][i]][1]);
23 }
24 }
25 int main(){
26 int n;
27 while(scanf("%d",&n)!=EOF){
28 memset(dp,0,sizeof(dp));
29 int root=0;
30 for(int i=1;i<=n;i++){
31 scanf("%d",&dp[i][1]);
32 root^=i;
33 a[i].clear();
34 }
35 int l,k;
36 while(true){
37 scanf("%d %d",&l,&k);//k比较吊
38 if(l==0 && k==0){
39 break;
40 }else{
41 a[k].push_back(l);
42 root^=l;
43 }
44 }
45 dfs(root);
46 printf("%d\n",max(dp[root][1],dp[root][0]));
47 }
48 return 0;
49 }