我怎样才能找到从任何节点到集合 A 的最短路径
How can i find the shortest path from any node to a set A
我有一个无向图 'G' 和图 G
中的一组 'A' 节点
我正在努力寻找一种有效的算法来找到从图 G 中的任何节点到集合中最近的节点的最短路径 'A'
我想到了这个:有一个到所有节点的最小距离数组,运行 集合 A 中的每个节点上的 BFS 算法,并且在 BFS 完成后,如果找到更短的路径则更新数组,这个时间复杂度是 O(k(n+m)) - 当 K 增长时很多,我被告知我可以使用更有效的算法。请注意,我只允许在本练习中使用 BFS 算法
创建一个额外的节点,该节点从这个额外的节点到 'A.' 运行 BFS 中的每个节点都有边。 'A' 中每个节点到最近节点的距离比到这个额外节点的距离小 1。
如果您从初始队列中 A
的所有节点开始,您真的只需要一次 BFS 算法。
- 在 map/dictionary
中跟踪已经访问过的节点及其从 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]}
我有一个无向图 'G' 和图 G
中的一组 'A' 节点我正在努力寻找一种有效的算法来找到从图 G 中的任何节点到集合中最近的节点的最短路径 'A'
我想到了这个:有一个到所有节点的最小距离数组,运行 集合 A 中的每个节点上的 BFS 算法,并且在 BFS 完成后,如果找到更短的路径则更新数组,这个时间复杂度是 O(k(n+m)) - 当 K 增长时很多,我被告知我可以使用更有效的算法。请注意,我只允许在本练习中使用 BFS 算法
创建一个额外的节点,该节点从这个额外的节点到 'A.' 运行 BFS 中的每个节点都有边。 'A' 中每个节点到最近节点的距离比到这个额外节点的距离小 1。
如果您从初始队列中 A
的所有节点开始,您真的只需要一次 BFS 算法。
- 在 map/dictionary 中跟踪已经访问过的节点及其从 A 到节点的路径
- 为您的
A
集合 中的每个节点 - 当队列中有更多元素时,从队列中弹出下一个节点和路径
- 如果该节点已经在
visited
映射中,则跳过它 - 否则,将其添加到具有给定路径的
visited
- 将邻居节点添加到具有扩展路径的队列
a
用元组(a, empty_path)
初始化BFS队列
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]}