题目描述
在一颗树中,每个节点代表一个家庭成员,节点的数字表示其个人的财富值,一个节点及其直接相连的子节点被定义为一个小家庭。
现给你一颗树,请计算出最富裕的小家庭的财富和。
输入描述
第一行为一个数 N,表示成员总数,成员编号 1~N。1 ≤ N ≤ 1000
第二行为 N 个空格分隔的数,表示编号 1~N 的成员的财富值。0 ≤ 财富值 ≤ 1000000
接下来 N -1 行,每行两个空格分隔的整数(N1, N2),表示 N1 是 N2 的父节点。
输入:
4
100 200 300 500
1 2
1 3
2 4
输出:
700
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeSet;
/**
* <h1>最富裕的小家庭</h1>
*/
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
// 成员总数
String input = in.nextLine();
int n = Integer.parseInt(input);
// 成员财富值数组
String money = in.nextLine();
int[] moneyArr = Arrays.stream(money.split("\\s+")).mapToInt(Integer::parseInt).toArray();
// 用来存储每个家庭
HashMap<Integer, ArrayList<Integer>> familyMap = new HashMap<>();
for (int i = 0; i < n - 1; i++) {
int[] family = Arrays.stream(in.nextLine().split("\\s+")).mapToInt(Integer::parseInt).toArray();
Integer p = family[0];
Integer c = family[1];
if (familyMap.containsKey(p)) {
familyMap.get(p).add(c);
} else {
ArrayList<Integer> childList = new ArrayList<>();
childList.add(c);
familyMap.put(p, childList);
}
}
TreeSet<Integer> fMoneySet = familyCalculator(familyMap, moneyArr);
System.out.println(fMoneySet.last());
}
}
private static TreeSet<Integer> familyCalculator(HashMap<Integer, ArrayList<Integer>> familyMap, int[] moneyArr) {
// 用来存储每个家庭的财富值
TreeSet<Integer> fMoneySet = new TreeSet<>();
for (Map.Entry<Integer, ArrayList<Integer>> family : familyMap.entrySet()) {
int familySum = moneyArr[family.getKey() - 1];
for (Integer child : family.getValue()) {
familySum += moneyArr[child - 1];
}
fMoneySet.add(familySum);
}
return fMoneySet;
}
}