题目描述:
整个公司的人员结构可以看作是一棵标准的多叉树。树的头节点是公司唯一的老板,除老板外,每个员工都有唯一的直接上级,叶节点是没有任何下属的基层员工,除基层员工外,每个员工都有一个或多个直接下级,另外每个员工都有一个快乐值。
这个公司现在要办 party,你可以决定哪些员工来,哪些员工不来。但是要遵循如下的原则:
1.如果某个员工来了,那么这个员工的所有直接下级都不能来。
2.派对的整体快乐值是所有到场员工快乐值的累加。
3.你的目标是让派对的整体快乐值尽量大。
给定一棵多叉树,请输出派对的最大快乐值。
输入描述:
第一行两个整数 n 和 root,n 表示公司的总人数,root 表示公司的老板。
第二行 n 个整数 happy_i 表示员工 i 的快乐值。
接下来 n - 1 行每行两个整数 u_i 和 v_i 表示 u_i 是 v_i 的直接上级。
输出描述:
输出一个整数表示最大快乐值。
输入示例:
3 1
5 1 1
1 2
1 3
输出示例:
5
代码实现:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int root=sc.nextInt();
int[] happyValues=new int[n];
for(int i=0;i<n;i++){
happyValues[i]=sc.nextInt();
}
List<Integer>[] lists=new ArrayList[n];
for(int i=0;i<n-1;i++){
int u=sc.nextInt()-1;
int v=sc.nextInt();
if(lists[u]==null){
lists[u]=new ArrayList<Integer>();
}
lists[u].add(v);
}
int ret=maxHappy(happyValues,lists,root)[0];
System.out.println(ret);
}
private static int[] maxHappy(int[] values,List<Integer>[] lists,int curUser){
if(lists[curUser-1]==null)
return new int[]{values[curUser-1],0};
int[] child;
int value1=values[curUser-1];
int value2=0;
for(int i=0;i<lists[curUser-1].size();i++){
child=maxHappy(values,lists,lists[curUser-1].get(i));
value1+=child[1];
value2+=child[0];
}
if(value1>value2){
return new int[]{value1,value2};
}else{
return new int[]{value2,value2};
}
}
}