无法理解prims算法

时间:2014-10-22 17:16:01

标签: pseudocode prims-algorithm

请帮助理解prims算法伪代码(因为它在coreman和wiki中) Prim's algorithm

    MST-PRIM (G, w, r) {
for each u ∈ G.V
u.key = ∞
u.parent = NIL
r.key = 0
Q = G.V
while (Q ≠ ø)
//1
u = Extract-Min(Q)
for each v ∈ G.Adj[u]
if (v ∈ Q) and w(u,v) < v.key
v.parent = u
v.key = w(u,v)}

我能够理解直到1或while循环,r.key = 0确保首先扫描根的邻居或邻近, 但由于你已经属于Q(节点队列,直到现在不包括在prims最小生成树中)而v也在Q中,因此无法生成prims MST。

同时也是核心人和wiki状态

 1. A = { (v, v.parent) : v ∈ V - {r} - Q }.
2. The vertices already placed into the minimum spanning tree are those in V−Q.
3. For all vertices v ∈ Q, if v.parent ≠ NIL, then v.key < ∞ and v.key is the weight of a light edge 

在第6-11行的while循环的每次迭代之前,    (v,v.parent)将v ::连接到已放入最小生成树的某个顶点。

因为A是我们的MST然后如何1.将有助于因为v已经包含在我们的MST中(如v∈V - {r} - Q所示)为什么它应该被包括在内。

1 个答案:

答案 0 :(得分:1)

对于您有疑虑的部分:

u = Extract-Min(Q) 
for each v ∈ G.Adj[u]
if (v ∈ Q) and w(u,v) < v.key
v.parent = u
v.key = w(u,v)

&#34;对于每个顶点v,属性v:key是连接到树中顶点的任何边的最小权重;按惯例,如果没有这样的边缘,则key =∞。&#34; (http://en.wikipedia.org/wiki/Prim's_algorithm

因此, u = Extract-Min(Q)将获得具有最小键的顶点。

对于每个v∈G.Adj [u] 将找到你的所有邻居。

if(v∈Q)和w(u,v)&lt; v.key 条件消除周期并检查路径是否应该更新。

然后以下代码行更新邻居边缘。

v.parent = u
v.key = w(u,v)

&#34;在第6-11行的while循环的每次迭代之前, 1. A = {(v,v.parent):v∈V - {r} - Q}。 &#34; (http://en.wikipedia.org/wiki/Prim's_algorithm

基于上面的陈述,在while循环A为空之前,Q = G.V!在while循环之后,您将得到A包含构成MST的所有顶点。 A中的每个顶点v都有一个父(v.parent)。对于root r,其父级为NIL。由于语句V - {r},根r被排除,但由于其子项以v.parent的形式存在于A中。

因此,在此链接http://en.wikipedia.org/wiki/Prim's_algorithm中,它指出:&#34; 2。已放入最小生成树的顶点是V-Q中的顶点。&#34;

和&#34;当算法终止时,最小优先级队列Q为空;因此,G的最小生成树A是A = {(v,v.parent):v∈V - {r}}。&#34;