题目描述
在一颗树中,每个节点代表一个家庭成员,节点的数字表示其个人的财富值,一个节点及其直接相连的子节点被定义为一个小家庭。
现给你一颗树,请计算出最富裕的小家庭的财富和。
输入描述
第一行为一个数 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.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, int[]> 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)) {
int[] child = familyMap.get(p);
child[1] = c;
} else {
int[] child = {c, -1};
familyMap.put(p, child);
}
}
TreeSet<Integer> fMoneySet = familyCalculator(familyMap, moneyArr);
System.out.println(fMoneySet.last());
}
}
private static TreeSet<Integer> familyCalculator(HashMap<Integer, int[]> familyMap, int[] moneyArr) {
// 用来存储每个家庭的财富值
TreeSet<Integer> fMoneySet = new TreeSet<>();
for (Map.Entry<Integer, int[]> family : familyMap.entrySet()) {
int[] child = family.getValue();
if (child[1] == -1) {
// 只有一个子节点
fMoneySet.add(moneyArr[family.getKey() - 1] + moneyArr[child[0] - 1]);
} else {
// 有两个子节点
fMoneySet.add(moneyArr[family.getKey() - 1] + moneyArr[child[0] - 1] + moneyArr[child[1] - 1]);
}
}
return fMoneySet;
}
}
标签:family,fMoneySet,int,familyMap,moneyArr,富裕,child,小家庭
From: https://blog.csdn.net/J1e_Sir/article/details/140525985