思路:
一道基础题
c o d e code code
#include<iostream>
#include<cstdio>
using namespace std;
int n;
int f[100100][2];
int a[100100], head[10010], tot;
struct node
{
int to, next;
}b[1001000];
void add(int x, int y)
{
b[++tot]=(node){y, head[x]};
head[x]=tot;
}
void dfs(int x, int fa)
{
f[x][1]=a[x];
for(int i=head[x]; i; i=b[i].next)
{
int y=b[i].to;
if(y==fa)
continue;
dfs(y, x);
f[x][0]=max(f[x][0], f[x][0]+max(f[y][1], f[y][0]));
f[x][1]=max(f[x][1], f[y][0]+a[x]);
}
}
int main()
{
scanf("%d", &n);
for(int i=1; i<=n; i++)
scanf("%d", &a[i]);
for(int i=1; i<n; i++)
{
int x, y;
scanf("%d%d", &x, &y);
add(x, y);
add(y, x);
}
dfs(1, 0);
printf("%d", max(f[1][0], f[1][1]));
return 0;
}