最富裕的小家庭

题目描述
在一颗树中,每个节点代表一个家庭成员,节点的数字表示其个人的财富值,一个节点及其直接相连的子节点被定义为一个小家庭。

现给你一颗树,请计算出最富裕的小家庭的财富和。

输入描述
第一行为一个数 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;
    }
}

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值