include<bits/stdc++.h>
using namespace std;
#define for1(i,a,b) for(int i=(a);i<=(b);i++)
#define for2(i,a,b) for(int i=(a);i>=(b);i--)
typedef long long LL;
typedef pair<int,int>PII;
typedef pair<double,double>PDD;
typedef unsigned long long ULL;
typedef pair<long long,int> PLI;
const int N = 4e5+10;
int head[N],edge[N],ver[N],nxt[N];
int n,tot;
LL f[N],res;
bool v[N];
int a[N];
void add(int x,int y)
{
ver[++tot]=y,nxt[tot]=head[x],head[x]=tot;
}
void dfs(int x,int fa)
{
for(int i=head[x];i;i=nxt[i])
{
int y=ver[i];
if(y!=fa)
{
dfs(y,x);
f[x]+=max(0LL,f[y]);
}
}
res=max(res,f[x]);
}
int main()
{
ios::sync_with_stdio(false);
cin>>n;
for1(i,1,n) cin>>a[i],f[i]=a[i];
for1(i,1,n-1){
int x,y;
cin>>x>>y;
add(x,y);
add(y,x);
}
dfs(1,0);
cout<<res;
return 0;
}
为什么吧if(y!=fa)删掉就MLE了,不是已经保证y是x的子节点吗,我觉得不需要这个判断