给定一棵树 T ,树 T 上每个点都有一个权值。
定义一颗树的子链的大小为:这个子链上所有结点的权值和 。
请在树 T 中找出一条最大的子链并输出。
解析:
就是求树上的最长路径。
设f[x]:表示到以x为根的子树的最长路径
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1000;
typedef long long ll;
int a[N];
ll f[N];
int n;
vector<int> G[N];
ll ans;
void dfs(int u,int fa)
{
f[u]=a[u];
ans=max(ans,f[u]);
for(int i=0;i<G[u].size();i++)
{
int j=G[u][i];
if(j==fa) continue;
dfs(j,u);
ans=max(ans,f[u]+f[j]);//更新最大值
f[u]=max(f[u],f[j]+a[u]);//更新到以u为根的子树的最大值
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n-1;i++)
{
int u,v;
scanf("%d %d",&u,&v);
G[u].push_back(v);G[v].push_back(u);
}
ans=-1e18;
dfs(1,-1);
printf("%lld\n",ans);
return 0;
}