#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int M =6100;
int dp[M][2]; //dp[i][0] i不去 = sigma累加 max(dp[j][0],dp[j][1]) j为i的子节点
// dp[i][1] i去 = sigma 累加 dp[j][0]
int n,rat[M],fa[M],visit[M],leaf[M],rt;//rt为root
void dfs(int node)
{
visit[node]=1;
if(leaf[node]) // 叶节点
{
dp[node][1]=rat[node];
dp[node][0]=0;
return;
}
for(int i=1;i<=n;i++)
{
if(!visit[i]&&fa[i]==node)
{
dfs(i);
dp[node][0]+=max(dp[i][1],dp[i][0]);//node不去,取i去或不去的最大值
dp[node][1]+=dp[i][0];
}
}
}
int main()
{
cin>>n;
memset(dp,0,sizeof(dp));
memset(visit,0,sizeof(visit));
for(int i=1;i<=n;i++)
{
cin>>rat[i];
leaf[i]=1;//leaf[i]节点i是否为叶节点
fa[i]=i;
dp[i][1]=rat[i];//初始化 dp[i][1] 并不是最终的dp[i][1]
}
int x,y;
while(cin>>x>>y&&(x+y))
{
fa[x]=y;//树 :rt除外每个节点只有一个直接先驱
leaf[y]=0;
}
rt=1;
while(fa[rt]!=rt)//找到root
{
rt=fa[rt];
}
dfs(rt);
int ans=max(dp[rt][0],dp[rt][1]);
cout<<ans<<endl;
return 0;
}
07-22
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交