AcWing 285. 没有上司的舞会
原题链接
简单
作者:
术
,
2021-03-06 19:31:55
,
所有人可见
,
阅读 284
#include <iostream>
#include <string.h>
using namespace std;
const int N=6005;
int n;
int happy[N];
int parents[N];
int h[N],e[N],ne[N],idx;
int f[N][2];
void add(int a,int b)
{
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
int dfs(int x)
{
f[x][1]=happy[x];
for(int i=h[x]; i!=-1; i=ne[i])
{
int j=e[i];
dfs(j);
f[x][0]+=max(f[j][0],f[j][1]);
f[x][1]+=f[j][0];
}
}
int main()
{
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>happy[i];
}
memset(h,-1,sizeof h);
for(int i=0; i<n-1; i++)
{
int a,b;
cin>>a>>b;
add(b,a);
parents[a]=b;
}
int root=0;
for(int i=1; i<=n; i++)
if(parents[i]==0)
root=i;
dfs(root);
cout<<max(f[root][0],f[root][1]);
//cout << "Hello world!" << endl;
return 0;
}