200字
最富裕的小家庭
2025-12-07
2025-12-07

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

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

输入描述

第一行为一个数 N,表示成员总数,成员编号 1~N。1< N 1000

第二行为 N 个空格分隔的数,表示编号 1~N 的成员的财富值。0 <=财富值<= 1000000.

接下来 N-1 行,每行两个空格分隔的整数 (N1,N2) ,表示 N1 是 N2 的父节点

输出描述

最富裕的小家庭的财富和

示例1:

输入:

4

100 200 300 500

1 2

1 3

2 4

输出

700

说明

成员1,2,3 组成的小家庭财富值为600成员

2,4 组成的小家庭财富值为700

        1(100)
       /   \
  2(200)     3(300)
  ↓
  4(500)
节点1:200 + 300 = 500
节点2: 200 + 500 = 700
def main():
    # 1. 读取成员总数 N
    n = int(input())
    # 示例输入: 4
    # 此时 n = 4

    # 2. 读取 N 个成员的财富值
    wealth = list(map(int, input().split()))
    # 示例输入: 100 200 300 500
    # 此时 wealth = [100, 200, 300, 500]

    # 3. 初始化小家庭财富和列表
    family_sums = wealth[:]  # 复制一份财富列表作为初始值
    # 此时 family_sums = [100, 200, 300, 500]
    # 每个索引 i 对应节点 i+1 的小家庭初始财富值

    # 4. 处理 N-1 条父子关系
    for _ in range(n - 1):  # 循环 3 次 (4-1=3)
        p, c = map(int, input().split())  # 读取父节点和子节点编号
        # 示例第一行: "1 2" → p=1, c=2
        # 示例第二行: "1 3" → p=1, c=3
        # 示例第三行: "2 4" → p=2, c=4

        # 将子节点的财富值加到父节点的小家庭财富和上
        # 注意: Python列表索引从0开始,节点编号从1开始,所以要减1
        family_sums[p - 1] += wealth[c - 1]
        # 第一次循环: family_sums[0] += wealth[1] → 100 + 200 = 300
        # 第二次循环: family_sums[0] += wealth[2] → 300 + 300 = 600
        # 第三次循环: family_sums[1] += wealth[3] → 200 + 500 = 700

    # 5. 找出最大值并输出
    print(max(family_sums))
    # family_sums = [600, 700, 300, 500]
    # max(family_sums) = 700
if __name__ == '__main__':
    main()

最富裕的小家庭
作者
Shisuiyi
发表于
2025-12-07
License
CC BY-NC-SA 4.0

评论