【问题标题】:How can i find the shortest path from any node to a set A如何找到从任何节点到集合 A 的最短路径
【发布时间】:2019-11-08 16:20:28
【问题描述】:
我有一个无向图“G”和图 G 中的一组节点“A”
我正在努力寻找一种有效的算法,该算法可以找到从图 G 中的任何节点到集合“A”中最近节点的最短路径
我想过这个:有一个到所有节点的最小距离数组,在集合 A 中的每个节点上运行 BFS 算法,在 BFS 完成后,如果找到更短的路径,则更新数组,这个时间复杂度是 O(k(n +m)) - 随着 K 的增长,这很多,有人告诉我有一个更有效的算法可以使用。请注意,我在这个练习中只能使用 BFS 算法
【问题讨论】:
标签:
algorithm
data-structures
graph
shortest-path
【解决方案1】:
创建一个额外的节点,它与“A”中的每个节点都有边。从这个额外的节点运行 BFS。 'A'中每个节点到最近节点的距离比到这个额外节点的距离小1。
【解决方案2】:
如果您从初始队列中 A 的所有节点开始,您真的只需要一次 BFS 算法。
- 在地图/字典中跟踪已访问的节点及其从 A 到节点的路径
- 使用
A 集合中每个节点a 的元组(a, empty_path) 初始化BFS 队列
- 当队列中有更多元素时,从队列中弹出下一个节点和路径
- 如果节点已经在
visited 映射中,跳过它
- 否则,使用给定路径将其添加到
visited
- 使用扩展路径将邻居节点添加到队列中
Python 示例:
# 2--0--1
# | |
# 3 4
graph = {0: [1, 2], 1: [0, 4], 2: [0, 3], 3: [2], 4: [1]}
A = [2, 0]
import collections
queue = collections.deque([(a, []) for a in A])
visited = {}
while queue:
cur, path = queue.popleft()
if cur in visited: continue
visited[cur] = path
for node in graph[cur]:
queue.append((node, [cur] + path))
print(visited)
# {2: [], 0: [], 3: [2], 1: [0], 4: [1, 0]}