洛谷 p1352 沒有上司的舞會 題解

 P1352 沒有上司的舞會

題目描述

某大學有N個職員,編號爲1~N。他們之間有從屬關係,也就是說他們的關係就像一棵以校長爲根的樹,父結點就是子結點的直接上司。如今有個週年慶宴會,宴會每邀請來一個職員都會增長必定的快樂指數Ri,可是呢,若是某個職員的上司來參加舞會了,那麼這個職員就不管如何也不願來參加舞會了。因此,請你編程計算,邀請哪些職員能夠使快樂指數最大,求最大的快樂指數。ios

輸入輸出格式

輸入格式:編程

 

第一行一個整數N。(1<=N<=6000)ide

接下來N行,第i+1行表示i號職員的快樂指數Ri。(-128<=Ri<=127)spa

接下來N-1行,每行輸入一對整數L,K。表示K是L的直接上司。code

最後一行輸入0 0blog

 

輸出格式:ip

 

輸出最大的快樂指數。ci

 

輸入輸出樣例

輸入樣例#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
相關文章
相關標籤/搜索