AcWing 285. 没有上司的舞会
原题链接
简单
作者:
魔仙哥
,
2024-10-10 12:54:38
,
所有人可见
,
阅读 1
树形DP的另类解法 ---- toposort
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define pb push_back
#define F(i,a,b) for(int i=a;i<=b;i++)
const int N = 6005;
vector <int> e[N];
queue <int> q;
int r[N],o[N],h[N],f[N][2],root,x,y,n;
int toposort()
{
F(i,1,n) if(!r[i]) q.push(i);
while(q.size())
{
int x = q.front();
q.pop();
for(int y:e[x])
{
f[y][0] += max(f[x][0],f[x][1]);
f[y][1] += f[x][0];
if(--r[y] == 0) q.push(y);
}
}
return max(f[root][0],f[root][1]);
}
int main()
{
cin>>n;
F(i,1,n) cin>>f[i][1];
F(i,1,n-1)
{
cin>>x>>y;
e[x].pb(y);
o[x]++; r[y]++;
}
F(i,1,n) if(!o[i]) root = i;
cout << toposort() << '\n';
return 0;
}