请帮助理解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所示)为什么它应该被包括在内。
答案 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;