【问题标题】:Dijkstra's and Prim's algorithmDijkstra 和 Prim 算法
【发布时间】:2017-05-04 17:13:30
【问题描述】:

正如我所见,Dijkstra 和 Prim 的算法几乎相同。这是来自维基百科的伪代码,我将解释我的困惑。

1  function Dijkstra(Graph, source):
2      dist[source] ← 0                                    // Initialization
3
4      create vertex set 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 is 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[]

Prim的算法差不多,为方便起见,我就改一下从第14行开始的循环

14     while Q is not empty:                              
15         u ← Q.extract_min()                            
16         for each neighbor v of u:                      
17             if v ∈ Q and length(u, v) < cost[v]
18                 cost[v] ← length(u, v)
19                 prev[v] ← u
20                 Q.decrease_priority(v, length(u, v))

有两个变化,第一个是将dist[] 替换为cost[],据我了解,这与算法解决不同问题的事实有关。 第二个对我来说是模糊的,即 Dijkstra 算法中没有if v ∈ Q 这个条件。我真的不明白为什么我们可以返回 Prim 算法中的访问顶点集,而这在 Dijkstra 算法中不会发生。

【问题讨论】:

  • if x ∈ Q x 是什么?
  • 打印错误,将x 替换为v

标签: algorithm graph-algorithm dijkstra


【解决方案1】:

在 Dijkstra 中,如果 alt 小于 dist[v] 的当前值,我们计算 alt ← dist[u] + length(u, v) 并将 dist[v] 设置为 alt。如果我们通过ualt 表示从起始节点到v 的距离。但是u是刚刚从Q中取出的节点,所以它与起始节点的距离大于等于之前从Q中取出的所有其他节点。因为 Dijkstra 要求所有边的权重都是非负的,所以如果 v 不在 Q 中,则保证 alt 大于或等于 dist[v],因为它是 dist[u]length(u, v) 的总和,并且所以它不会通过if 中的条件。换句话说,如果v 不在Q 中,则u 将相对于我们已经拥有的v 的路径绕道而行。

【讨论】:

    【解决方案2】:

    不确定我的想法是否正确。对于 Dijkstra 和 prims 算法,我们应该只处理 Q 中的顶点。 对于 Dijkstra 算法,伪代码可能不会显式检查当前顶点是否仍在 Q 中,但它注释为“只有 v 仍在 Q 中”

     for each neighbor v of u:                      // only v that is still in Q
    

    我认为它们与 x ∈ Q 的含义相同

    17             if x ∈ Q and length(u, v) < cost[v]
    

    如果这里的x代表第16行的“v”。

    【讨论】:

      【解决方案3】:

      Dijkstra 和 Prim 算法非常相似。

      区别在于:

      • Prim 算法:通过无向边最接近最小生成树的顶点

      • Dijsktra 算法:通过有向路径最接近源的顶点

      来源:Sedgewick & Wayne 的算法

      【讨论】:

        猜你喜欢
        • 2012-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多