AcWing 285. 没有上司的舞会
原题链接
简单
作者:
Qiner
,
2024-12-24 09:49:27
,
所有人可见
,
阅读 4
#include <iostream>
#include <cstring>
using namespace std;
const int NN = 6010;
int h[NN], e[NN], ne[NN], idx; // 邻接表
int H[NN], dp[NN][2], has_father[NN]; // 题目没有说明哪个点是根节点,所以开一个has_father数组
int N;
void add(int a, int b){
e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}
void dfs(int u){
dp[u][1] = H[u]; // 这一步很关键
for (int i = h[u]; i != -1; i = ne[i]){
int son = e[i];
dfs(son);
dp[u][1] += dp[son][0];
dp[u][0] += max(dp[son][0], dp[son][1]);
}
}
int main(){
cin >> N; memset(h, -1, sizeof(h));
for (int i = 1; i <= N; i ++) cin >> H[i];
for (int i = 1; i < N; i ++){
int k, l; cin >> l >> k; // k 是 l 的父节点,所以k --> l
add(k, l); has_father[l] = 1;
}
int root = 1;
while (has_father[root]) root ++; // 找根节点
dfs(root);
cout << max(dp[root][0], dp[root][1]) << endl;
return 0;
}