两个代码全0分(TLE)
#include<bits/stdc++.h>
using namespace std;
const int N=2*16010;
int dp[N],cnt,n,a[N],ans=INT_MIN,x,y;
vector<int>v[N];
int dfs(int tp,int fa){
dp[tp]=a[tp];
for(int i=0;i<v[tp].size();++i){
int t=v[tp][i];
if(t!=fa){
dfs(t,tp);
if(dp[t]>0)dp[tp]+=dp[t];
}
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin>>n;
for(int i=1;i<=n;++i){
cin>>a[i];
}
for(int i=1;i<n;++i){
cin>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
dfs(1,0);
for(int i=1;i<=n;++i){
ans=max(ans,dp[i]);
}
cout<<ans;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=16010;
int nxt[2*N],head[N],to[2*N],dp[N],cnt,n,a[N],ans,x,y;
void add(int from,int t){
nxt[++cnt]=head[from];
to[cnt]=t;
head[from]=cnt;
}
int dfs(int tp,int fa){
dp[tp]=a[tp];
for(int i=head[tp];i;i=nxt[i]){
int t=to[i];
if(t!=fa){
dfs(t,tp);
if(dp[t]>=0)dp[tp]+=dp[t];
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;++i){
cin>>a[i];
}
for(int i=1;i<n;++i){
cin>>x>>y;
add(x,y);
add(y,x);
}
dfs(1,0);
for(int i=1;i<=n;++i){
ans=max(ans,dp[i]);
}
cout<<ans;
return 0;
}