题目描述: 在一棵树中,每个节点代表一个家庭成员,节点的数字表示其个人的财富值,一个节点及其直接相连的子节点被定义为一个小家庭。 现给你一棵树,请计算出最富裕的小家庭的财富和。 输入描述: 第一行为一个数N,表示成员总数,成员编号1-N,1<=N<=1000 第二行为N个空格分隔的数,表示编号1-N的成员的财富值。0<=财富值<=100000 接下来N-1行,每行两个空格分隔的整数(N1,N2),表示N1是N2的父节点Q。 输出描述: 最富裕的小家庭的财富和 示例1 输入: 4 100 200 300 500 1 2 1 3 2 4 输出: 700 说明: 成员1.2.3组成的小家庭财富值为600 成员2,4组成的小家庭财富值为700 示例2 输入: 4 100 200 300 500 1 2 1 3 1 4 输出: 1100 说明: 成员1,2,3,4组成的小家庭财富值为1100
解题思路:
1、处理输入,构建树结构:
·树的边为第2行至N-1行的数据对
·使用字典实现,key为树节点编号,value为此节点的所有子节点列表
2、计算小家庭财富和:对于单个节点,计算此节点财富+所有子节点财富之和
3、最大财富和:遍历节点,返回最大财富
代码部分
def find_tree_wealth(n, wealth, edges):
#构建树结构
tree = {i: [] for i in range(1, n + 1)}
for n1, n2 in edges:
tree[n1].append(n2) #n1为n2的父节点
max_wealth = 0
#遍历每个节点,计算小家庭财富
for node in range(1, n + 1):
family_wealth = wealth[node - 1] #当前节点财富
for child in tree[node]:
family_wealth += wealth[child - 1] #子节点财富
max_wealth = max(max_wealth, family_wealth)
return max_wealth
n = int(input())
weath = list(map(int, input().split()))
edges = [tuple(map(int, input().split())) for _ in range(n - 1)] #n-1表示树的边
print(find_tree_wealth(n, weath, edges))
知识点:字典、元组、树
结语:越简单的题目解法应该越多,请路过大神留下新的思路供本小白学习一下,打开思路