码迷,mamicode.com
首页 > 其他好文 > 详细

Luogu P1122 最大子树和

时间:2019-10-26 19:17:44      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:add   name   using   数组   dfs   void   code   print   names   

Luogu P1122 最大子树和

维护DP数组\(f\),其中\(f[x]\)表示以\(x\)为根节点的子数的美观程度。
则对于任意节点\(u\),有\(f[u]=\sum f[v](v\in u的子树)\)
最后每次退出DFS的时候更新一下\(ans\)即可。

#include<bits/stdc++.h>
#define N 16010

using namespace std;

int n,cnt,ans;
int a[N],head[N],f[N];

struct node {
    int nxt,to;
}edge[N*2];

void addEdge(int u,int v) {
    edge[++cnt]=(node){head[u],v};
    head[u]=cnt;
    return;
}

void Read() {
    scanf("%d",&n);
    for(int i=1;i<=n;i++) {
        scanf("%d",&a[i]);
    }
    for(int i=1;i<=n-1;i++) {
        int a,b;
        scanf("%d%d",&a,&b);
        addEdge(a,b);
        addEdge(b,a);
    }
    return;
}

void DFS(int x,int fa) {
    f[x]=a[x];
    for(int i=head[x];i;i=edge[i].nxt) {
        int v=edge[i].to;
        if(v!=fa) {
            DFS(v,x);
            f[x]+=max(0,f[v]);
        }
    }
    ans=max(ans,f[x]);
    return;
}

void Print() {
    printf("%d",ans);
}

int main()
{
    Read();
    DFS(1,0);
    Print();
    return 0;
}

Luogu P1122 最大子树和

标签:add   name   using   数组   dfs   void   code   print   names   

原文地址:https://www.cnblogs.com/luoshui-tianyi/p/11744188.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!