这道题真的是已经被用烂了。
一个是最大人数是多少,一个是最大的happy值是多少,都是大同小异的。
从树根开始dfs做dp
如果这个人是来的
那么dp[root][1]先初始化,继续向下做dp。
然后最后的状态方程式
dp[root][0]+=max(dp[child][0],dp[child][1]);
dp[root][1]+=dp[child][0];
#include<bits/stdc++.h>
using namespace std;
const int maxn = 6005;
vector<int>v[maxn];
int indegree[maxn],vis[maxn],dp[maxn][2],happy[maxn];
int n,a,b;
int findroot()
{
for(int i=0; i<=maxn; i++)
{
if(vis[i]&&indegree[i]==0)
return i;
}
}
void dfs(int root)//dp
{
dp[root][1]=happy[root];
for(int i=0; i<v[root].size(); i++)
dfs(v[root][i]);
for(int i=0; i<v[root].size(); i++)
{
dp[root][0]+=max(dp[v[root][i]][0],dp[v[root][i]][1]);
dp[root][1]+=dp[v[root][i]][0];
}
}
int main()
{
while(cin>>n)
{
memset(indegree,0,sizeof(indegree));
memset(dp,0,sizeof(dp));
memset(vis,0,sizeof(vis));
for(int i=1; i<=n; i++)
{
cin>>happy[i];
v[i].clear();
}
while(cin>>a>>b,a||b)
{
v[b].push_back(a);
vis[a]=1;
vis[b]=1;
indegree[a]++;
}
int root = findroot();//find the root
dfs(root);
//cout<<root<<endl;
cout<<max(dp[root][0],dp[root][1])<<endl;
}
return 0;
}