Description
Input
Output
Sample Input
Sample Output
输入:
输入n个结点,接下去的n行,表示1-n的每个结点分别具有的活跃值,在接下来去的n-1行,输入a,b,表示b是a的上司
输出:
由于直接有上司和下属关系的两个人不能同时参加party, 求出能让party活跃值最大的方案(求出最大的活跃值即可).
#include <iostream> #include <cstdio> #include <cstring> #include <vector> using namespace std; const int maxn=6005; vector<int> v[maxn]; int value[maxn],in[maxn],dp[maxn][2]; inline int max(int a,int b){return a>b?a:b;} void dfs(int id) { dp[id][0]=0;dp[id][1]=value[id]; for(int i=0;i<v[id].size();i++) { int u=v[id][i]; dfs(u); dp[id][0]+=max(dp[u][0],dp[u][1]); dp[id][1]+=dp[u][0]; } } int main() { int n,a,b,i,ans; while(~scanf("%d",&n)) { for(i=1;i<=n;i++) v[i].clear(); for(i=1;i<=n;i++) scanf("%d",&value[i]); memset(in,0,sizeof(in)); while(scanf("%d%d",&a,&b),a+b) { v[b].push_back(a);in[a]++; } memset(dp,0,sizeof(dp)); ans=0; for(i=1;i<=n;i++) if(!in[i]) { dfs(i); ans+=max(dp[i][0],dp[i][1]); } printf("%d\n",ans); } return 0; }
原文:http://www.cnblogs.com/xiong-/p/3898133.html