洛谷 p1352 没有上司的舞会 题解

 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
输出样例#1:
5
——————————————————————————————————我是华丽丽的分割线————————————————————————————————

树形动规果题。
 1 /*
 2     Problem:P1352 没有上司的舞会
 3     OJ:        洛谷 
 4     User:    S.B.S.
 5     Time:    27 ms
 6     Memory: 16992 kb 
 7     Length: N/A
 8 */
 9 #include<iostream>
10 #include<cstdio>
11 #include<cstring>
12 #include<cmath>
13 #include<algorithm>
14 #include<queue>
15 #include<cstdlib>
16 #include<iomanip>
17 #include<cassert>
18 #include<climits>
19 #include<functional>
20 #include<bitset>
21 #include<vector>
22 #include<list>
23 #include<map>
24 #define F(i,j,k) for(int i=j;i<=k;i++)
25 #define M(a,b) memset(a,b,sizeof(a))
26 #define FF(i,j,k) for(int i=j;i>=k;i--)
27 #define maxn 10001
28 #define inf 0x3f3f3f3f
29 #define maxm 1001
30 #define mod 998244353
31 //#define LOCAL
32 using namespace std;
33 int read(){
34     int x=0,f=1;char ch=getchar();
35     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
36     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
37     return x*f;
38 }
39 int n,m;
40 int x,y,k;
41 int cnt,c[maxn],head[maxn];
42 bool b[maxn];
43 int f[maxn][2];
44 vector <int> edge[maxn];
45 void dfs(int u)
46 {
47     int a,b;
48     for(int i=0;i<edge[u].size();i++)
49     {
50         dfs(edge[u][i]);
51         f[u][0]+=max(f[edge[u][i]][0],f[edge[u][i]][1]);
52         f[u][1]+=f[edge[u][i]][0]; 
53     }
54     f[u][1]+=c[u];
55 }
56 int main()
57 {
58     std::ios::sync_with_stdio(false);//cout<<setiosflags(ios::fixed)<<setprecision(1)<<y;
59     #ifdef LOCAL
60     freopen("data.in","r",stdin);
61     freopen("data.out","w",stdout);
62     #endif
63     int n,m; 
64     cin>>n;
65     for(int i=1;i<=n;i++) cin>>c[i];
66     int x,y;
67     for(int i=1;i<=n;i++)
68     {
69         cin>>x>>y;
70         if(x==0&&y==0) break;
71         else
72         {
73             edge[y].push_back(x);
74             b[x]=true;
75         }
76     }
77     for(int i=1;i<=n;i++)
78     {
79         if(b[i]==false)
80         {
81             dfs(i);
82             cout<<max(f[i][1],f[i][0])<<endl;
83             break;
84         }
85     } 
86     return 0;
87 }
p1352

 

posted @ 2016-09-30 16:29  SBSOI  阅读(377)  评论(0编辑  收藏  举报