HDU 1520

 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 }

 

posted @ 2017-03-01 19:09  boom~  阅读(141)  评论(0)    收藏  举报