Acwing 285.没有上司的舞会
Ural大学有N名职员,编号为1~N。
他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司。
每个职员有一个快乐指数,用整数 H
给出,其中 1≤i≤N
。
现在要召开一场周年庆宴会,不过,没有职员愿意和直接上司一起参会。
在满足这个条件的前提下,主办方希望邀请一部分职员参会,使得所有参会职员的快乐指数总和最大,求这个最大值。
#include<bits/stdc++.h> #define N 10000 using namespace std; int head[N],to[N],v[N],net[N]; int cut,n; void add(int from,int t){net[++cut]=head[from];to[cut]=t;head[from]=cut;} int f[N][2],du[N]; void dfs(int x) { for(int i=head[x];i;i=net[i]) { int y=to[i]; dfs(y); f[x][0]+=f[y][1]; f[x][1]+=max(f[y][1],f[y][0]); } f[x][0]+=v[x]; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&v[i]); for(int i=1;i<n;i++) { int x,y; scanf("%d%d",&x,&y); add(y,x); du[x]++; } for(int i=1;i<=n;i++) if(!du[i]) { dfs(i); printf("%d",max(f[i][0],f[i][1])); return 0; } return 0; }