题目链接
树上DP
重点:::一个点可以有两条链,做题时这点忘记了
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
const int N = 200010;
int e[N],h[N],ne[N],w[N],idx=0;
int f[N];
void add(int a,int b)
{
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int res=-0x3f3f3f3f;
void dfs(int u,int fa)
{
f[u]=w[u];
for(int i=h[u];i!=-1;i=ne[i])
{
int j=e[i];
if(j==fa)continue;
dfs(j,u);
res=max(res,f[u]+f[j]);//这句话很重要
f[u]=max(f[u],f[j]+w[u]);
}
res=max(f[u],res);
}
signed main()
{
memset(h,-1,sizeof h);
cin>>n;
for(int i=1;i<=n;i++)cin>>w[i];
for(int i=1;i<n;i++)
{
int a,b;
cin>>a>>b;
add(a,b);
add(b,a);
}
dfs(1,-1);
cout<<res<<endl;
}