Input
Employees are numbered from 1 to N. A first line of input contains a number N. 1 <= N <= 6 000. Each of the subsequent N lines contains the conviviality rating of the corresponding employee. Conviviality rating is an integer number in a range from -128 to 127. After that go T lines that describe a supervisor relation tree. Each line of the tree specification has the form:
L K
It means that the K-th employee is an immediate supervisor of the L-th employee. Input is ended with the line
0 0
Output
Output should contain the maximal sum of guests' ratings.
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
题目大意:
先输入n,代表n个人,下面n行代表n个人的权值,在输入若干对数字l,k,代表k是l的上司,现在有一个晚会,n个人中若干个人参加,要求参加的人不存在上司与下属的关系,
求参加的人最大的权值和。
#include <iostream> #include <algorithm> #include <vector> #include <cstring> using namespace std; int in[6005],dp[6005][2],n; vector<int> vec[6005]; void dfs(int root) { for(int i=0;i<vec[root].size();i++) { int x=vec[root][i]; dfs(x); dp[root][1]+=dp[x][0];///上司参加,下属一定不参加 dp[root][0]+=max(dp[x][0],dp[x][1]);///上司不参加,加上下属参加和不参加的最大值 } } int main() { while(cin>>n) { memset(in,0,sizeof in); memset(dp,0,sizeof dp); for(int i=1;i<=n;i++) cin>>dp[i][1],vec[i].clear(); int x,y; while(cin>>x>>y,x||y) vec[y].push_back(x),in[x]++; for(int i=1;i<=n;i++) { if(!in[i]) { dfs(i); cout<<max(dp[i][1],dp[i][0])<<'\n'; break; } } } return 0; }