P1122 最大子树和 (树形dp

添加链接描述

#include<bits/stdc++.h>
using namespace std;
const int N=32009;
int w[N];
int e[N],h[N],ne[N],idx,vis[N];
void add(int a,int b){
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int dp[N];
void dfs(int u,int fa){
    dp[u]=w[u];
    for(int i=h[u];~i;i=ne[i]){
        int j=e[i];
        if(j!=fa){
            dfs(j,u);
            if(dp[j]>0){
            dp[u]+=dp[j];
            }
        }
        
    }
}
int main(){
    memset(h,-1,sizeof h);
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>w[i];
    }
    for(int i=1;i<n;i++){
        int a,b;
        cin>>a>>b;
        add(a,b);
        add(b,a);
    }
    dfs(1,0);
    int ans=-0x3f3f3f3f;
    for(int i=1;i<=n;i++)ans=max(ans,dp[i]);
    cout<<ans<<endl;
    return 0;
}
上一篇:算法打卡:数组模拟单链表


下一篇:BT基础知识简介