我是没看出来啥问题他就是MLE
#include<iostream>
using namespace std;
struct EDGE{
int to,next;
}edge[40000];
int head[40000];
int num=0;
int fa[20000];
int dp[20000];
int ans=0;
void add(int x,int y)
{
edge[++num].next=head[x];
head[x]=num;
edge[num].to=y;
}
void make(int now,int f)
{
fa[now]=f;
for(int i=head[now];i;i=edge[i].next)
{
int v=edge[i].to;
if(v!=f)
make(now,v);
}
}
void DP(int now,int f)
{
for(int i=head[now];i;i=edge[i].next)
{
int v=edge[i].to;
if(v!=f)
{
DP(v,now);
dp[now]+=max(0,dp[v]);
}
}
ans=max(ans,dp[now]);
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>dp[i];
for(int i=1;i<=n-1;i++)
{
int x,y;
cin>>x>>y;
add(x,y);
add(y,x);
}
int root=1;
make(root,0);
DP(root,0);
cout<<ans;
return 0;
}