#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=16005;
int head[maxn],val[maxn],n,cnt=0,ans=-0x7f7f7f7f;
struct edge{
int nxt,to;
}E[maxn<<1];
inline void adde(int u,int v){
++cnt;
E[cnt].to=v;
E[cnt].nxt=head[u];
head[u]=cnt;
}
int dfs(int cu,int fa){
int res=0;
for(int i=head[cu];i;i=E[i].nxt){
int to=E[i].to;
if(fa==to)continue;
res+=max(0,dfs(to,cu));
}
ans=max(res,ans);
ans=max(res+val[cu],ans);
return res+val[cu];
}
int main(){
scanf("%d",&n);
bool bl=true;
for(int i=1;i<=n;++i){
scanf("%d",&val[i]);
if(val[i]>0)bl=false;
ans=max(ans,val[i]);
}
if(bl)return(printf("%d",ans)&0);
for(int i=1;i<n;++i){
int u,v;
scanf("%d%d",&u,&v);
adde(u,v);adde(v,u);
}
dfs(1,0);
cout<<ans;
return 0;
}
这个代码无法AC,需将dfs函数改成
int dfs(int cu,int fa){
int res=val[cu];
for(int i=head[cu];i;i=E[i].nxt){
int to=E[i].to;
if(fa==to)continue;
res+=max(0,dfs(to,cu));
}
ans=max(res,ans);
return res;
}
才可以哪位大佬可以给我解释解释,谢谢