📅  最后修改于: 2023-12-03 15:41:17.947000             🧑  作者: Mango
给定一个非循环图,每个节点都有一个权重。 请你编写一个程序来计算图的每个深度处的最小元素的权重之和。深度表示从起点出发到达该节点的最短路径长度。 注意:节点权重为正整数,且不会超过 100000。
我们可以使用 BFS(广度优先搜索)来解决这个问题。从起点开始,依次遍历该节点的所有邻居节点,如果邻居节点没有被访问过,则将邻居节点加入队列,同时记录下该节点的权重和到达该节点的深度。
具体步骤如下:
代码如下:
from collections import deque
def min_depth_sum(root):
queue = deque([(root, 0)])
visited = set([root])
depth_sum = [0]
depth_min = [float('inf')]
while queue:
node, depth = queue.popleft()
if depth > len(depth_sum) - 1:
depth_sum.append(0)
depth_min.append(float('inf'))
depth_sum[depth] += node.val
depth_min[depth] = min(depth_min[depth], node.val)
for neighbor in node.neighbors:
if neighbor not in visited:
queue.append((neighbor, depth+1))
visited.add(neighbor)
return sum(depth_min)
代码说明:
以如下图为例:
执行代码:
node1 = Node(val=1)
node2 = Node(val=2)
node3 = Node(val=3)
node4 = Node(val=4)
node5 = Node(val=5)
node6 = Node(val=6)
node1.neighbors = [node2, node3]
node2.neighbors = [node1, node4, node5]
node3.neighbors = [node1, node6]
node4.neighbors = [node2]
node5.neighbors = [node2]
node6.neighbors = [node3]
print(min_depth_sum(node1)) # 7
结果为 7,理由如下: