📅  最后修改于: 2023-12-03 15:40:26.410000             🧑  作者: Mango
在一个加权树中,我们需要求出给定节点到树中每个叶节点的距离总和。这个问题在树的应用中非常常见,比如在路由选择算法中,我们需要找到给定节点与其它节点之间的最短路径,计算出路由的距离。
下面是一个针对这个问题的解决方案,其中我们使用了广度优先搜索算法(BFS)来遍历树,并计算出每一个叶节点到给定节点的距离。具体实现细节如下:
n
:树中的节点数edges
:表示树中的边weights
:表示每个节点的权值target
:表示要查询的节点distances
:一个长度为n
的数组,表示每个节点到给定节点的距离。from collections import deque
def get_distances(n: int, edges: List[Tuple[int,int]], weights: List[int], target: int) -> List[int]:
# 用字典表示树的邻接表
tree = {i: [] for i in range(n)}
for u, v in edges:
tree[u].append(v)
tree[v].append(u)
# 广度优先搜索
queue = deque([(target, 0)])
visited = set()
distances = [0] * n
while queue:
node, distance = queue.popleft()
visited.add(node)
for neighbor in tree[node]:
if neighbor not in visited:
new_distance = distance + weights[neighbor]
distances[neighbor] = new_distance
queue.append((neighbor, new_distance))
return distances
下面是一个树的示例,树的边界为黑色粗线,节点右侧的数字表示该节点的权值,要查询的节点为红色,其它节点为白色。
输入分别为:
n = 11
edges = [(0, 1), (0, 2), (1, 3), (1, 4), (2, 5), (2, 6), (3, 7), (3, 8), (6, 9), (6, 10)]
weights = [5, 2, 3, 1, 4, 2, 8, 7, 6, 3, 5]
target = 2
输出为:
[14, 7, 0, 12, 5, 10, 10, 19, 16, 13, 15]
其中distances[2]
为0,表示给定节点到自身的距离为0,其它数字表示给定节点到对应叶节点的距离总和。