洛谷——P1352 沒有上司的舞會
阿新 • • 發佈:2017-05-06
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 沒有上司的舞會