没有很多的讲解= = 注意用法。
#include <bits/stdc++.h>
#define re register int
using namespace std;
const int N=1e6;
int n;
struct node
{
int ver,next;
}e[N];
int a[N],in[N];
int head[N],tot;
int f[N][2];
void add(int x,int y)
{
e[++tot].ver=y;
e[tot].next=head[x];
head[x]=tot;
}
void dfs(int x,int pre)
{
f[x][0]=0,f[x][1]=a[x];
for(re i=head[x];i;i=e[i].next)
{
int y=e[i].ver;
if(y==pre) continue;
dfs(y,x);
f[x][0]+=max(f[y][0],f[y][1]);
f[x][1]+=f[y][0];
}
}
void solve()
{
cin>>n;
for(re i=1;i<=n;i++) scanf("%d",&a[i]);
for(re i=1;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
in[y]++;
}
int root;
for(re i=1;i<=n;i++) if(!in[i]) root=i;
dfs(root,root);
cout<<max(f[root][0],f[root][1])<<endl;
}
int main() {
solve();
return 0;
}