AcWing 285. 没有上司的舞会
原题链接
简单
作者:
minux
,
2020-05-04 10:14:10
,
所有人可见
,
阅读 544
#include <bits/stdc++.h>
using namespace std;
const int N=6005;
int n;
int ha[N];
vector<int> G[N]; // 邻接表存储关系树
int f[N][2];
bool fa[N]; // 存储父节点关系
void dfs(int node){
f[node][1]=ha[node]; // 当前node参加, 贡献快乐指数ha[node]
for(auto &n: G[node]){
dfs(n);
f[node][0]+=max(f[n][0], f[n][1]); // 直接上司node不参加,累计max(f[n][0], f[n][1])子节点参加或者不参加中的快乐值最大值
f[node][1]+=f[n][0]; // 直接上司node参加, 累计子节点不参加的快乐贡献值
}
}
int main(){
memset(ha, 0x00, sizeof ha);
memset(fa, 0x00, sizeof fa);
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;
G[b].push_back(a);
fa[a]=true;
}
// 计算root
int root=1;
while(fa[root]) ++root;
dfs(root);
cout<<max(f[root][0], f[root][1]); // 快乐指数最大的情况为选择root和不选择root之间的最大值
return 0;
}