萌新初学OI,才刚开始用Luogu,不太熟悉
#include<bits/stdc++.h>
using namespace std;
#define re register
#define in inline
#define get getchar()
#define ll long long
in int read()
{
int t=0,x=1; char ch=get;
while(ch=='-' && (ch<'0'|| ch>'9') )ch=get;
if(ch=='-') ch=get,x=-1;
while(ch<='9' && ch>='0') t=t*10+ch-'0', ch=get;
return t*x;
}
const int _=1e4+5;
struct edge{
int to,ne;
}e[_];
int h[_],n,m,a[_],vis[_],f[_][2],tot;
in void add(int x,int y)
{
e[++tot].ne=h[x],e[tot].to=y,h[x]=tot;
}
in void dfs(int u,int fa)
{
f[u][1]=a[u],f[u][0]=0;
for(re int i=h[u];i;i=e[i].ne)
{
int v=e[i].to;
dfs(v,u);
}
for(re int i=h[u];i;i=e[i].ne)
{
int v=e[i].to;
f[u][0]+=f[v][1];
f[u][1]+=f[v][0];
}
}
int main()
{
n=read();
for(re int i=1;i<=n;i++) a[i]=read();
for(re int i=1;i<n;i++)
{
int x=read(),y=read();
add(y,x);
vis[x]=1;
}
int root=0;
for(re int i=1;i<=n;i++)
if(!vis[i]){vis[i]=1,root=i;break;}
dfs(root,0);
cout<<max(f[root][1],f[root][0]);
}