Algorithm 如何找到从任何节点到集合a的最短路径
我有一个无向图'G'和图G中的一组节点'a' 我正在努力寻找一个高效的算法,找到从图G中的任何节点到集合“A”中最近节点的最短路径Algorithm 如何找到从任何节点到集合a的最短路径,algorithm,data-structures,graph,shortest-path,Algorithm,Data Structures,Graph,Shortest Path,我有一个无向图'G'和图G中的一组节点'a' 我正在努力寻找一个高效的算法,找到从图G中的任何节点到集合“A”中最近节点的最短路径 我考虑过这个问题:对所有节点使用一个最小距离数组,在集合a中的每个节点上运行BFS算法,在BFS完成后,如果发现较短的路径,则更新数组,时间复杂度为O(k(n+m))-当k增长时,这是一个很大的问题,我被告知有一个更有效的算法可以使用。请注意,在本练习中,我只允许使用BFS算法创建一个额外节点,该节点与“A”中的每个节点都有边。从该额外节点运行BFS。“A”中从每个
我考虑过这个问题:对所有节点使用一个最小距离数组,在集合a中的每个节点上运行BFS算法,在BFS完成后,如果发现较短的路径,则更新数组,时间复杂度为O(k(n+m))-当k增长时,这是一个很大的问题,我被告知有一个更有效的算法可以使用。请注意,在本练习中,我只允许使用BFS算法创建一个额外节点,该节点与“A”中的每个节点都有边。从该额外节点运行BFS。“A”中从每个节点到最近节点的距离比到这个额外节点的距离小1。如果从初始队列中的
A
中的所有节点开始,您实际上只需要通过一次BFS算法
- 在地图/字典中跟踪已访问的节点及其到节点的路径
- 对于
集中的每个节点a
,使用元组a
初始化BFS队列(a,空路径)
- 当队列中有更多元素时,从队列中弹出下一个节点和路径
- 如果节点已经在
已访问的
映射中,请跳过它
- 否则,使用给定路径将其添加到已访问的
- 将邻居节点添加到具有扩展路径的队列中
#2--0--1
# | |
# 3 4
图={0:[1,2],1:[0,4],2:[0,3],3:[2],4:[1]}
A=[2,0]
导入集合
queue=collections.deque([(a,[]),用于a中的a])
访问={}
排队时:
cur,path=queue.popleft()
如果访问了cur in:继续
已访问[cur]=路径
对于图[cur]中的节点:
追加((节点,[cur]+路径))
打印(已访问)
# {2: [], 0: [], 3: [2], 1: [0], 4: [1, 0]}