P1352 没有上司的舞会

题目

题目描述

某大学有N个职员,编号为1~N。他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri,但是呢,如果某个职员的上司来参加舞会了,那么这个职员就无论如何也不肯来参加舞会了。所以,请你编程计算,邀请哪些职员可以使快乐指数最大,求最大的快乐指数。

输入输出格式

输入格式:

 

第一行一个整数N。(1<=N<=6000)

接下来N行,第i+1行表示i号职员的快乐指数Ri。(-128<=Ri<=127)

接下来N-1行,每行输入一对整数L,K。表示K是L的直接上司。

最后一行输入0 0

 

输出格式:

 

输出最大的快乐指数。

 

输入输出样例

输入样例#1: 复制
7
1
1
1
1
1
1
1
1 3
2 3
6 4
7 4
4 5
3 5
0 0

 

 

分析

 

  • 树形DP

 

代码

 1 #include<iostream>
 2 #include<vector>
 3 using namespace std;
 4 int n;
 5 int a[6010],flag[6010];
 6 vector <int> q[6010];
 7 int f[6010][2];
 8 void dp(int x)
 9 {
10     f[x][0]=0;
11     f[x][1]=a[x];
12     for (int i=0;i<q[x].size();i++)
13     {
14         dp(q[x][i]);
15         f[x][0]+=max(f[q[x][i]][0],f[q[x][i]][1]);
16         f[x][1]+=f[q[x][i]][0];
17     }
18 }
19 int main ()
20 {
21     cin>>n;
22     for (int i=1;i<=n;i++)
23        cin>>a[i];
24     for (int i=1,x,y;i<=n;i++)
25     {
26         cin>>x>>y;
27         q[y].push_back(x);
28         flag[x]=1;
29     }
30     int root;
31     for (int i=1;i<=n;i++)
32     {
33         if (!flag[i])
34         {
35             root=i;
36             break;
37         }
38     }
39     dp(root);
40     cout<<max(f[root][0],f[root][1]);
41 }

 

posted @ 2019-02-23 20:40  Melted_czj  阅读(233)  评论(0)    收藏  举报
body { background-color:whitesmoke; } // 修改背景颜色为半透明 #home,#sideBarMain>div,#blog-sidecolumn>div>div,.catListView{ background-color:rgba(255,255,255,0); } // 修改其他边框的颜色