Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何找到从任何节点到集合a的最短路径_Algorithm_Data Structures_Graph_Shortest Path - Fatal编程技术网

Algorithm 如何找到从任何节点到集合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”中从每个

我有一个无向图'G'和图G中的一组节点'a'

我正在努力寻找一个高效的算法,找到从图G中的任何节点到集合“A”中最近节点的最短路径


我考虑过这个问题:对所有节点使用一个最小距离数组,在集合a中的每个节点上运行BFS算法,在BFS完成后,如果发现较短的路径,则更新数组,时间复杂度为O(k(n+m))-当k增长时,这是一个很大的问题,我被告知有一个更有效的算法可以使用。请注意,在本练习中,我只允许使用BFS算法

创建一个额外节点,该节点与“A”中的每个节点都有边。从该额外节点运行BFS。“A”中从每个节点到最近节点的距离比到这个额外节点的距离小1。

如果从初始队列中的
A
中的所有节点开始,您实际上只需要通过一次BFS算法

  • 在地图/字典中跟踪已访问的节点及其到节点的路径
  • 对于
    a
    集中的每个节点
    a
    ,使用元组
    (a,空路径)
    初始化BFS队列
  • 当队列中有更多元素时,从队列中弹出下一个节点和路径
  • 如果节点已经在
    已访问的
    映射中,请跳过它
  • 否则,使用给定路径将其添加到已访问的
  • 将邻居节点添加到具有扩展路径的队列中
Python中的示例:

#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]}