题目
思路
这道题是树形DP模板题。
代码
#include<iostream>
#include<cstdio>
using namespace std;
int n,w[100010],x,y,ru[100010],f[100010][2],ans;
int tot,hd[100010];
struct node
{
int y,next;
}a[200010];
void add(int x,int y)
{
a[++tot]=(node){y,hd[x]};
hd[x]=tot;
}
void dfs(int x,int fa)
{
f[x][1]=w[x];
for(int i=hd[x]; i; i=a[i].next)
{
int yy=a[i].y;
if(yy==fa)
continue;
dfs(yy,x);
f[x][0]=max(f[x][0],f[x][0]+max(f[yy][1],f[yy][0]));
f[x][1]=max(f[x][1],f[yy][0]+w[x]);
}
}
int main()
{
cin>>n;
for(int i=1; i<=n; i++)
scanf("%d",&w[i]);
for(int i=1; i<=n-1; i++)
{
scanf("%d%d",&x,&y);
ru[y]++;
add(y,x);
add(x,y);
}
for(int i=1; i<=n; i++)
if(!ru[i])
{
dfs(i,0);
break;
}
for(int i=1; i<=n; i++)
ans=max(ans,max(f[i][0],f[i][1]));
cout<<ans;
return 0;
}