Luogu P1352 没有上司的舞会

Posted labelray

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Luogu P1352 没有上司的舞会相关的知识,希望对你有一定的参考价值。

题目描述

某大学有N个职员,编号为1~N。他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri,但是呢,如果某个职员的上司来参加舞会了,那么这个职员就无论如何也不肯来参加舞会了。所以,请你编程计算,邀请哪些职员可以使快乐指数最大,求最大的快乐指数。

输入输出格式

输入格式:

 

第一行一个整数N。(1<=N<=6000)

接下来N行,第i+1行表示i号职员的快乐指数Ri。(-128<=Ri<=127)

接下来N-1行,每行输入一对整数L,K。表示K是L的直接上司。

最后一行输入0 0

 

输出格式:

 

输出最大的快乐指数。

 

输入输出样例

输入样例#1: 
7
1
1
1
1
1
1
1
1 3
2 3
6 4
7 4
4 5
3 5
0 0
输出样例#1: 
5

#include <iostream>
#include <cstdio>
using namespace std;

int f[5][6000],n,a,b,root;
int ne[12000],po[12000],ru[12000];

void dp(int x){
    for(int i = po[x];i;i = ne[i]){
        dp(i);
        f[1][x] = max(max(f[1][x],f[0][i]+f[1][x]),f[0][i]);
        f[0][x] = max(max(f[0][x],f[1][i]+f[0][x]),max(f[1][i],f[0][i]));
    }
}
int main(){
    scanf("%d",&n);
    for(int i = 1;i <= n;i ++)
     scanf("%d",&f[1][i]);
    for(int i = 1;i <= n;i ++) {
         scanf("%d%d",&b,&a);
         ru[b] ++;
         ne[b] = po[a]; 
         po[a] = b;
     }
    for(int i = 1;i <= n;i ++)
     if(ru[i] == 0) 
            root = i;
    dp(root);   
    printf("%d",max(f[1][root],f[0][root]));
    return 0;
}

 

以上是关于Luogu P1352 没有上司的舞会的主要内容,如果未能解决你的问题,请参考以下文章

Luogu P1352 没有上司的舞会

[luogu]P1352 没有上司的舞会[树形DP]

Luogu P1352 没有上司的舞会

luogu P1352ybtoj 树形DP课堂过关 例题1树上求和 & 没有上司的舞会

洛谷——P1352 没有上司的舞会

P1352 没有上司的舞会