没有上司的舞会
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll maxn=6e3+10;
ll n,cnt=0;
ll root,ans=0;
ll head[maxn],f[maxn][2];
map<ll,ll>mp;
ll a[maxn];
struct edge{
ll u,v,nex;
}e[maxn<<1];
void init(){
for(ll i=1;i<=n;i++){
f[i][1]=a[i];
}
}
void add(ll u,ll v){
cnt++;
e[cnt].u=u;
e[cnt].v=v;
e[cnt].nex=head[u];
head[u]=cnt;
}
void dfs(ll u){
ll f0=0,f1=a[u];
for(ll i=head[u];i;i=e[i].nex){
ll v=e[i].v;
dfs(v);
f1+=f[v][0];
f0+=f[v][1];
}
f[u][0]=f0;
f[u][1]=f1;
ans=max(ans,f[u][0]);
ans=max(ans,f[u][1]);
}
int main()
{
cin>>n;
for(ll i=1;i<=n;i++) cin>>a[i];
for(ll i=1;i<n;i++){
ll l,k;
cin>>l>>k;
add(k,l);
mp[l]=1;
}
for(ll i=1;i<=n;i++){
if(mp[i]==0){
root=i;
break;
}
}
init();
dfs(root);
cout<<ans<<endl;
return 0;
}
树上染色