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;
}
标签:子树,idx,int,ne,dfs,add,P1122,dp 来源: https://blog.csdn.net/Minelois/article/details/120142128