AcWing 285. 没有上司的舞会
原题链接
中等
作者:
HalfSummer
,
2020-05-08 15:44:36
,
所有人可见
,
阅读 717
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 6010;
int last[N],ne[N],edge[N],cnt;
int ha[N];
bool HF[N];
int f[N][2];
void add(int a, int b){
edge[cnt] = b;
ne[cnt] = last[a];
last[a] = cnt++;
}
void MZBZY(int root){
f[root][1] = ha[root];
for(int i = last[root];i != -1;i = ne[i]){
MZBZY(edge[i]);
f[root][0]+=max(f[edge[i]][0],f[edge[i]][1]);
f[root][1]+=f[edge[i]][0];
}
}
int main(){
memset(edge,-1,sizeof edge);
memset(last,-1,sizeof last);
int n;
cin>>n;
for(int i = 1;i <= n;i ++){
cin>>ha[i];
}
for(int i = 1;i <= n - 1;i ++){
int a,b;
cin>>a>>b;
add(b,a);
HF[a] = true;
}
int root = 1;
while(HF[root]) root++;
MZBZY(root);
cout<<max(f[root][0],f[root][1]);
}