在一颗树中,每个节点代表一个家庭成员,节点的数字表示其个人的财富值,一个节点及其直接相连的子节点被定义为个小家庭。
现给你一颗树,请计算出最富裕的小家庭的财富和。
输入描述
第一行为一个数 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 = 700def 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()