The basic idea
Tree dp entry questions, 0 means no check 1 when selected.
\ [\ Begin {array} { l} treedp [u] [0] = max (treedp [u.boss] [0], treedp [u.boss] [1]) \\ treedp [u] [1] = treedp [u.boss] [0] + arr [u]; \ end {array} \]
#include<bits/stdc++.h>
using namespace std;
vector<int>boss[7000];
int arr[7000],brr[7000];
int treedp[7000][2];
int n;
void dfs(int u)
{
treedp[u][1]=arr[u];
treedp[u][0]=0;
//for(int i=1;i<=n;i++)
{
for(int v:boss[u])
{
dfs(v);
treedp[u][0]+=max(treedp[v][0],treedp[v][1]);
treedp[u][1]+=treedp[v][0];
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>arr[i];
}
for(int i=1;i<=n-1;i++)
{
int l,r;
cin>>l>>r;
boss[r].push_back(l);
brr[l]=1;
}
for(int i=1;i<=n;i++)
{
if(brr[i]==0)
{
//cout<<i<<endl;
dfs(i);
cout<<max(treedp[i][0],treedp[i][1])<<endl;
break;
}
}
return 0;
}