【问题标题】:Running Dijkstra Algorithm运行 Dijkstra 算法
【发布时间】:2021-12-24 16:28:49
【问题描述】:

给定一张这样的图表:

         A
        ^ ^
       /   \
      3     4
     /       \
    B -- 5 -> C

E={(B,A)(C,A)(B,C)}

如果我们在节点 A 上运行 Dijkstra 会发生什么?

A 被初始化为 0,B 和 C 被初始化为无穷大,但 A 没有指向任何地方。

那么我们在 B 和 C 之间随机选择?还是算法在这种情况下不起作用?

谢谢!

【问题讨论】:

  • 根本没有从 A 到任何地方的路径。
  • 确实,但我还是想知道从B到A的最短路径,等等
  • Dijkstra 通常会找到从给定源到图中所有其他顶点的最短路径。如果你想找到从 B 到其他顶点的最短路径,从 A 开始搜索死路也没关系,你只需以 B 作为源顶点再次运行它。如果您愿意,您可以遍历所有顶点并为每个顶点查找/保存最短路径,因为每个搜索都是独立的。

标签: algorithm graph dijkstra


【解决方案1】:

Dijkstra 仍将运行并为您提供此图表的正确答案。如果您这样选择,您可以仅使用起始节点初始化队列,并在您探索它们时向队列中/在队列中添加或更新邻居。在这种情况下,算法将在从队列中提取 (A) 并探索其零邻居的一次迭代后终止,适当地将到 B 和 C 的距离保留为无穷大(没有 prev 节点)并将 A 的路径保留为零。如果您考虑一下,这是理想的答案,因为没有从 A 到 B 或 C 的路径。

或者,如果你像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

提取 A 并探索它不存在的邻居后,没有更新。然后它将在 B 和 C 之间任意选择以提取下一个,因为它们具有相同的距离(当然不是“随机”,这取决于您如何初始化/从队列中提取)。

当它检查 B 时,它会看到它可以在 Infinity + 5 中到达 C,不比当前到 Infinity 的 C 的距离更好,所以没有任何更新,并且在 Infinity + 3 中到达 A,不比 A 的当前距离好0。

当它检查 C 时,它将看到它可以在 Infinity + 4 中到达 A,并不比当前到 A 的距离为 0 好,因此没有任何更新。

那么队列为空,同样返回dist[A] = 0, dist[B] = dist[C] = Infinity的结果。

因此,Dijkstra 的正确实现将能够处理这样的图(就像任何具有非负权重的有向图一样)。

【讨论】:

  • 太好了,谢谢你的回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-01
  • 2013-11-21
  • 2015-07-14
  • 2021-03-13
相关资源
最近更新 更多