5829: 没有上司的舞会 

时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte
总提交: 31            测试通过:22

描述

Ural大学有N名职员,编号为1~N。他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司。每个职员有一个快乐指数,用整数 H_i 给出,其中 1≤i≤N。现在要召开一场周年庆宴会,不过,没有职员愿意和直接上司一起参会。在满足这个条件的前提下,主办方希望邀请一部分职员参会,使得所有参会职员的快乐指数总和最大,求这个最大值。

输入

第一行一个整数N。(1<=N<=6000)
接下来N行,第i+1行表示i号职员的快乐指数H_i。(-128<=H_i<=127)
接下来N-1行,每行输入一对整数L, K。表示K是L的直接上司。
最后一行输入0,0。

输出

输出最大的快乐指数。

样例输入

7
1
1
1
1
1
1
1
1 3
2 3
6 4
7 4
4 5
3 5
0 0

样例输出

 5

题目来源

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 int n;
 5 const int maxn=6005;
 6 int arr[maxn];
 7 vector<int> G[maxn];
 8 int dp[maxn][2],in[maxn];
 9
10 void dfs(int ee){
11     dp[ee][0]=0;
12     dp[ee][1]=arr[ee];
13     for(int x:G[ee]){
14         dfs(x);
15         dp[ee][0]+=max(dp[x][1],dp[x][0]);  //有两种悬着
16         dp[ee][1]+=dp[x][0];
17     }
18 }
19
20 int main()
21 {
22     ios::sync_with_stdio(false);
23     cin>>n;
24     for(int i=1;i<=n;i++) cin>>arr[i];
25     for(int i=1,d1,d2;i<=n;i++){
26         cin>>d1>>d2;
27         G[d2].push_back(d1);
28         in[d1]++;
29     }
30     int root;
31     for(int i=1;i<=n;i++){
32         if(in[i]==0) {root=i;break;}  //找入读为0的根
33     }
34     dfs(root);
35     cout << max(dp[root][0],dp[root][1]) << endl;
36     return 0;
37 }
View Code
12-28 06:54