1. 程式人生 > >洛谷——P1352 沒有上司的舞會

洛谷——P1352 沒有上司的舞會

tps 否則 pre www using 題目 表示 i++ color

https://www.luogu.org/problem/show?pid=1352#sub

題目描述

某大學有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

用f[i][0]表示選i,f[i][1]表示不選
然後如果選了i,那麽連出去的點一定不選——f[i][0]+=f[v][1]
否則連出去的點可能選也可能不選——f[i][1]+=max(f[v][0],f[v][1])
 1 #include <algorithm>
 2
#include <cstdio> 3 #include <vector> 4 5 using namespace std; 6 7 const int N(6015); 8 vector<int>vec[N]; 9 int n,x,y,w[N],root; 10 int dad[N],f[N][2]; 11 12 void DFS(int x) 13 { 14 f[x][0]=w[x]; 15 for(int i=0;i<vec[x].size();i++) 16 { 17 DFS(vec[x][i]);
18 f[x][1]+=max(f[vec[x][i]][0],f[vec[x][i]][1]); 19 f[x][0]+=f[vec[x][i]][1]; 20 } 21 } 22 23 int main() 24 { 25 scanf("%d",&n); 26 for(int i=1;i<=n;i++) scanf("%d",w+i); 27 while(scanf("%d%d",&x,&y)&&x&&y) 28 { 29 dad[x]=y; 30 vec[y].push_back(x); 31 } 32 for(root=1;root<=n;++root) if(!dad[root]) break; 33 DFS(root); 34 printf("%d",max(f[root][1],f[root][0])); 35 return 0; 36 }

洛谷——P1352 沒有上司的舞會