【问题标题】:Finding all equally shortest paths with Dijkstra using a Priority Queue使用优先队列使用 Dijkstra 查找所有同样最短的路径
【发布时间】:2020-02-13 02:54:47
【问题描述】:

我想实现 dijkstra 算法以在图中两个节点之间找到最便宜的路径。权重是节点之间的 X,Y 距离。我了解如何实现 dijkstra,但我需要找到所有最短的路径。因此,如果 2 条路径的长度相同,我想要它们。

我也在 Google 和 Stack Overflow 上到处寻找。但我无法真正理解给出的一些答案。也没有人使用优先队列。我正在考虑标记我们已经访问过的节点,但这不会切断路径吗?

这是我要实现的Wikipedia的伪代码。

1  function Dijkstra(Graph, source):
2      dist[source] ← 0                           // Initialization
3
4      create vertex priority queue Q
5
6      for each vertex v in Graph:           
7          if v ≠ source
8              dist[v] ← INFINITY                 // Unknown distance from source to v
9          prev[v] ← UNDEFINED                    // Predecessor of v
10
11         Q.add_with_priority(v, dist[v])
12
13
14     while Q is not empty:                      // The main loop
15         u ← Q.extract_min()                    // Remove and return best vertex
16         for each neighbor v of u:              // only v that are still in Q
17             alt ← dist[u] + length(u, v) 
18             if alt < dist[v]
19                 dist[v] ← alt
20                 prev[v] ← u
21                 Q.decrease_priority(v, alt)
22
23     return dist, prev

如果有人有任何建议,或者如果优先队列不可行,请告诉我。谢谢。

【问题讨论】:

  • 你的问题是“这个伪代码是如何工作的”还是“我如何将它翻译成 c++”?
  • 我的问题是“我如何扩展这个伪代码以便我可以在 C++ 中实现它”

标签: c++ algorithm shortest-path dijkstra


【解决方案1】:

如果 prev[] 不是顶点而是顶点列表,你可能会得到你想要的。在第 20 行,您创建了一个仅包含 u 的新列表。此外(可能在 17 到 18 之间),如果 alt == dist[v],则将 u 添加到 prev[v]。由于此伪代码在 v == 目标时不会停止,因此您应该找到所有最短路径。

关于优先级队列,有一个问题是通过将 av 添加到 Q 来获得时间,但是如果更改 av,则必须在 Q 中间找到它(慢),然后将其删除(慢)并添加更改后的版本。有些数据结构可以更快地完成该过程。我使用优先级队列,但我不删除更改的顶点。我添加更改的顶点而不删除它们的旧版本。如果我选择了一个好的比较器,路径较短的版本(或者,如果相等,则较长的 prev 列表)将首先被拉出。所以我必须测试 Q 中的所有你是否被访问;如果是的话,我可以把你扔掉。在 while Q ... 顶点 u 结束时,必须标记为已访问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多