题目描述 Description
Ural大学有N个职员,编号为1~N。他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。每个职员有一个快乐指数。现在有个周年庆宴会,要求与会职员的快乐指数最大。但是,没有职员愿和直接上司一起与会。
输入描述 Input Description
第一行一个整数N。(1<=N<=6000)
接下来N行,第i+1行表示i号职员的快乐指数Ri。(-128<=Ri<=127)
接下来N-1行,每行输入一对整数L,K。表示K是L的直接上司。
最后一行输入0,0。
输出描述
Output Description
输出最大的快乐指数。
样例输入
Sample Input
7
1
1
1
1
1
1
1
1 3
2 3
6 4
7 4
4 5
3 5
0 0
样例输出
Sample Output
5
树形DP,复习了一下vector的用法。。
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cmath> 4 #include<cstring> 5 #include<iostream> 6 #include<vector> 7 #include<map> 8 #include<set> 9 #include<stack> 10 #include<string> 11 #include<algorithm> 12 #define maxn 6000+50 13 #define inf 0x7fffffff 14 #define xiao 1e-9 15 using namespace std; 16 int a[maxn],b[maxn],f[maxn][2]; 17 vector<int> vec[6010]; 18 inline void dfs(int k) 19 { 20 for(int i=0;i<vec[k].size();++i) 21 { 22 int h=vec[k][i]; 23 dfs(h); 24 f[k][0]+=max(f[h][0],f[h][1]); 25 f[k][1]+=f[h][0]; 26 } 27 f[k][1]+=a[k]; 28 } 29 int main() 30 { 31 int n,x,y; 32 memset(b,0,sizeof(b)); 33 scanf("%d",&n); 34 for(int i=1;i<=n;++i) scanf("%d",&a[i]); 35 for(int i=1;i<n;++i) 36 { 37 scanf("%d%d",&x,&y); 38 if(x==0&&y==0) break; 39 vec[y].push_back(x); 40 b[x]=y; 41 } 42 for(int i=1;i<=n;++i) 43 if(b[i]==0) { dfs(i);cout<<max(f[i][1],f[i][0]);break;} 44 return 0; 45 } 46