P1122 最大子树和

/*
一棵树删去若干条边 各点权值max
f[u]:root==u 的树 删去若干条边 max
f[u]=a[u]+f[v]>=0? f[v]:0 
*/
/*
7
-1 -1 -1 1 1 1 0
1 4
2 5
3 6
4 7
5 7
6 7

2
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string.h>
#include<queue>
#include<vector>
#include<bits/stdc++.h>
#define ll long long
#define ddd printf("-----------------------\n");
using namespace std;
const int maxn=16e3 +10;
const int mod=998244353;
const int inf=0x3f3f3f3f;

int n,f[maxn],a[maxn],ans=-inf;
int head[maxn],to[maxn<<1],nxt[maxn<<1],tot;

void add(int a,int b){
    to[++tot]=b,nxt[tot]=head[a],head[a]=tot;
}
void dfs(int u,int fa)
{
    f[u]=a[u];
    for(int i=head[u];i;i=nxt[i])
    {
        int v=to[i];if(v==fa) continue;
        dfs(v,u);
        if(f[v]>=0) f[u]+=f[v];
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n-1;i++){
        int u,v;cin>>u>>v;
        add(u,v),add(v,u);
    }
    dfs(1,1);
    for(int i=1;i<=n;i++) ans=max(ans,f[i]);
    cout<<ans<<'\n';
    
    return 0;
}

 

posted @ 2023-11-09 06:05  JMXZ  阅读(6)  评论(0)    收藏  举报