毫无疑问,图中会有大量的最短路径。因此很难在满足时间复杂度的情况下生成所有最短路径。但是我可以给你一个简单的方法,可以得到尽可能多的最短路径。
算法
- 从起点运行 Dijkstra 算法,得到 disS[i] 列表(起点到点 i 的最短距离)。然后从终点运行 Dijkstra 算法,得到 disT[i] 列表(终点到点 i 的最短距离)
- 制作一个新图:对于原图中的一条边,如果 disS[a] + disT[b] + w(a, b) == disS[endpoint],我们在新图中添加一条边。很明显,新图是一个 DAG(有向无环图),并且有一个 sink(起点)和一个 target(终点)。从接收器到目标的任何路径都是原始图中的最短路径。
- 您可以在新图表中运行 DFS。在递归和回溯中保存路径信息,任何时候到达目标,保存的信息都是一条最短路径。算法何时结束完全取决于您。
伪代码:</h2>
def find_one_shortest_path(graph, now, target, path_info):
if now == target:
print path_info
return
for each neighbor_point of graph[now]:
path_info.append(neighbor_point)
find_one_shortest_path(graph, neighbor_point, target, path_info) #recursion
path_info.pop(-1) #backtracking
def all_shortest_paths(graph, starting_point, ending_point):
disS = [] # shortest path from S
disT = [] # shortest path from T
new_graph = []
disS = Dijkstra(graph, starting_point)
disT = Dijkstra(graph, endinng_point)
for each edge<a, b> in graph:
if disS[a] + w<a, b> + disT[b] == disS[ending_point]:
new_graph.add(<a, b>)
find_one_shortest_path(new_graph, starting_point, ending_point, [])