子节点和父节点只能选一个,价值最大是多少
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=6005;
int n,a[N];
struct node
{
int nxt,to;
}edge[N<<1];
int head[N],cnt;
int dp[N][2];//代表第i个节点选或者不选
int Max(int a,int b)
{
return a>b?a:b;
}
void add(int u,int v)
{
edge[++cnt].to=v;
edge[cnt].nxt=head[u];
head[u]=cnt;
}
void dfs(int u,int pre)
{
for(int i=head[u];i;i=edge[i].nxt)
{
int v=edge[i].to;
if(v!=pre)
{
dfs(v,u);
dp[u][1]+=dp[v][0];
dp[u][0]+=Max(dp[v][1],dp[v][0]);
}
}
}
int main()
{
while(~scanf("%d",&n))
{
cnt=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
dp[i][0]=head[i]=0;
dp[i][1]=a[i];
}
int u,v;
while(scanf("%d%d",&u,&v)&&u+v)
add(u,v),add(v,u);
dfs(1,0);
printf("%d\n",Max(dp[1][0],dp[1][1]));
}
}