dp[i]代表以i为根节点的子树种美丽值最大值,对于其连接的每个子树,可以进行连接,也可以不连接(删掉边)最终输出最大值即可
#include<cstdio>
#include<cmath>
#include<iostream>
# include<algorithm>
# include<cstring>
using namespace std;
typedef long long int ll;
typedef struct
{
int b,e;
}xinxi;
xinxi s[100000];
int f[100000];
int nex[100000];
int len;
void add(int x,int y)
{
s[len].b=x;
s[len].e=y;
nex[len]=f[x];
f[x]=len;
len++;
}
ll dp[100000];
ll a[100000];
void dfs(int now,int father)
{
int x=f[now];
while(x!=-1)
{
int j=s[x].e;
if(j==father)
{
x=nex[x];
continue;
}
dfs(j,now);
dp[now]=max(dp[now],dp[j]+dp[now]);
x=nex[x];
}
}
int main ()
{
memset(f,-1,sizeof(f));
fill(dp,dp+16000+1,-999999999);
int n,nn;
cin>>n;
nn=n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
dp[i]=a[i];
}
n--;
while(n--)
{
int x,y;
cin>>x>>y;
add(x,y);
add(y,x);
}
dfs(1,0);
ll ans=-99999999999;
for(int i=1;i<=nn;i++)
{
ans=max(ans,dp[i]);
}
cout<<ans;
return 0;
}