【发布时间】: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 ∈ Qx是什么? -
打印错误,将
x替换为v
标签: algorithm graph-algorithm dijkstra