码迷,mamicode.com
首页 > 其他好文 > 详细

【Luogu P1352】 没有上司的舞会

时间:2018-04-09 00:21:11      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:cst   哪些   int   space   ret   std   iostream   namespace   AC   

题目描述

某大学有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】 没有上司的舞会

标签:cst   哪些   int   space   ret   std   iostream   namespace   AC   

原文地址:https://www.cnblogs.com/labelray/p/8748112.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!