点击跳转、
这道题树形dp不是很难,但是提醒了个点,注意存图的时候,是从1开始还是0开始。。。。
两种情况
要他来,那么他的下属就不能来,如果他不来,他的下属可以来或者不来。。
这样就是两道方程,直接递推就好了
#include <bits/stdc++.h>
#define INF 0x3F3F3F3F
#define N 6000+100
using namespace std;
vector<int> a[N];
int n,r[N],f[N][2],root,v[N],templ,tempk;
void dp(int x)
{
f[x][0]=0;
f[x][1]=r[x];
for (int i = 0; i < a[x].size(); i++)
{
int y=a[x][i];
dp(y);
f[x][0]+=max(f[y][0],f[y][1]);
f[x][1]+=f[y][0];
}
}
int main()
{
scanf("%d",&n);
for (int i = 1; i <= n; i++)
scanf("%d",&r[i]);
for (int i = 1; i <=n-1; i++)
{
scanf("%d%d",&templ,&tempk);
a[tempk].push_back(templ);
v[templ]++;
}
for (int i = 1; i <= n; i++)
if(!v[i]) {root=i;break;}
dp(root);
cout<<max(f[root][1],f[root][0])<<endl;
}