给出一棵树,每个节点都有一个值,选了一个结点不能选它的儿子和父亲结点。
#include<string.h>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
int N,f[6001][2],parent[6001];
bool visited[6006];
void tree_dp(int node)
{
if(!visited[node])
{
visited[node]=1;
for(int i=1;i<=N;i++)
{
if(parent[i]==node)
{
if(!visited[i])
tree_dp(i);
f[node][1]+=f[i][0];
f[node][0]+=max(f[i][0],f[i][1]);
}
}
}
}
int main()
{
cin>>N;
int index=1;
while(index<=N)
{
cin>>f[index][1];
index++;
}
int left,right;
cin>>left>>right;
while(left!=0&&right!=0)
{
parent[left]=right;
cin>>left>>right;
}
for(int i=1;i<=N;i++)
{
tree_dp(i);
}
int maxn=0;
for(int i=1;i<=N;i++)
{
int temp=max(f[i][0],f[i][1]);
maxn=max(temp,maxn);
}
cout<<maxn<<endl;
return 0;
}