标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 9137 Accepted Submission(s): 3917
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <vector> using namespace std; int n; int happy[6005]; vector<int> son[6005]; int dp[6005][3]; int vis[6005]; void dfs(int now) { dp[now][1] = happy[now]; dp[now][0] = 0; for(int i=0;i<son[now].size();i++) { int nex = son[now][i]; dfs(nex); dp[now][1] += dp[nex][0]; dp[now][0] += max(dp[nex][0],dp[nex][1]); } } int main() { while(scanf("%d",&n)!=EOF&&n) { memset(dp,0,sizeof(dp)); memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) { scanf("%d",&happy[i]); } int l,k; while(1) { scanf("%d %d",&l,&k); if(l==0&&k==0) break; son[k].push_back(l); vis[l] = 1; } int father = 0; for(int i=1;i<=n;i++) { if(!vis[i]) { father = i; break; } } dfs(father); printf("%d\n",max(dp[father][0],dp[father][1])); for(int i=1;i<=n;i++) son[i].clear(); } return 0; }
标签:
原文地址:http://www.cnblogs.com/littlepear/p/5747829.html