Acwing 285.没有上司的舞会

Ural大学有N名职员,编号为1~N。

他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司。

每个职员有一个快乐指数,用整数 Hi

给出,其中 1iN

现在要召开一场周年庆宴会,不过,没有职员愿意和直接上司一起参会。

在满足这个条件的前提下,主办方希望邀请一部分职员参会,使得所有参会职员的快乐指数总和最大,求这个最大值。

#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;
}

 

posted @ 2020-12-22 21:04  君与  阅读(60)  评论(0编辑  收藏  举报