树上子链------------------------------树形dp

给定一棵树 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;
}
发布了491 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43690454/article/details/104754997