以最低的运行时间和复杂性返回所有最短路径

问题描述

This post has 是这个问题不断出现的结果,但没有提供最佳解决方案。

目前我正在尝试使用 BFS 返回从 from 开始到 target 结束的所有最短路径,但是我的算法或我使用的数据结构遇到了瓶颈。

代码

// The graph is an adjacency list of type unordered_map<string,unordered_set<string>>
// deque with pair of (visited unordered_set,vector with current path)
deque q = [({from},[from]);

while q:
  pair = q.dequeue()
  visited = pair.first
  path = pair.second
  
  foreach adjacent_node to path[-1] in the graph:
    if (adjacent_node == target):
      res.append(path + [adjacent_node])
    
    else if adjacent_node not in visited:
      newPath = path + [adjacent_node]
      visited.add(adjacent_node)
      q.push((visited,newPath))

目前瓶颈似乎与队列的项目对有关。我不确定如何在不存储每个路径的访问集或不将新路径复制到队列中的情况下解决问题。

解决方法

首先,您应该知道最短路径的数量可能很大,并且将它们全部返回是不切实际的。考虑一个包含 2k+1 层的图,编号从 12k+1,其中每一层都与下一层完全连接,奇数层只有一个点,而偶数层有 q 个点。虽然这个图只有 k(q+1)+1 个节点和 kq 个边,但总共有 q^k 条不同的最短路径,对于普通计算机来说处理效率很低。但是,如果您确定最短路径的数量相对较少,我可以引入以下算法。

基本思想是为每个节点存储一个列表back,意思是fromx之间的最短距离等于from和{{之间的最短距离1}} 加一当且仅当 vv in back[x] 可以在此过程中计算。然后您可以执行深度优先搜索以打印所有最短路径。伪代码(顺便说一句,我注意到您的代码不正确):

back[x]

对不起,我的英语不好。随时指出我的错别字和错误。