P1122 最大子树和

树形DP第二道

#include <bits/stdc++.h>
#define read read()
using namespace std;

const int N = 20000;

int n,size,ans;
int head[N],a[N];
//int f[N][2];
int f[N];

int read
{
    int x = 0,f = 1; char ch = getchar();
    while( ch < 48 || ch > 57 ) {if(ch == '-') f = -1; ch = getchar();}
    while(ch >= 48 && ch <= 57) {x = 10 * x + ch - 48; ch = getchar();}
    return x * f;
}

struct edge{
    int v,nxt;
}e[N<<1];

void add(int u,int v)
{
    e[++size].v = v;
    e[size].nxt = head[u];
    head[u] = size;
}

void dp(int u,int fa)
{
    //f[u][0] = 0; f[u][1] = a[u];
    f[u] = a[u];
    for(int i = head[u]; i; i = e[i].nxt)
    {
        int v = e[i].v;
        if(v == fa) continue;
        dp(v,u);
        //f[u][0] = 0;
        //f[u][1] += max
        f[u] += max(0,f[v]);
    }
    ans = max(ans, f[u]);
}

int main()
{
//    freopen("sontree.in","r",stdin);
    n = read; int u,v;
    for(int i = 1; i <= n; i++) a[i] = read;
    for(int i = 1; i < n; i++)
    {
        u = read; v = read;
        add(u,v);
        add(v,u);
    }
    dp(1,0);
    printf("%d",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/mzg1805/p/10298724.html