是什么让prim的算法避免CSLR书中代码中的循环?

时间:2019-10-25 03:45:34

标签: algorithm prims-algorithm

在CSLR教科书第三版,第634-635页中,普里姆算法的伪代码如何产生无循环的MST?是什么使Prim算法阻止伪代码中的循环?

假设边(i,g)和(i,h)的权重分别为1。由于它一直在选择最小边缘,因此我们可以选择(i,g),这将创建一个循环。

enter image description here

如果节点访问了[],则可以防止循环,但是下面的教科书伪代码中没有这样的检查。

enter image description here

4 个答案:

答案 0 :(得分:0)

我一个人有这个问题,但是我想说的一般原因不是基于 在示例中显示的代码。 据您所知,用于生成生成树的Prim算法如下:

它将边缘和节点添加到树中 所以我们来归纳一下 归纳是这个 如果我们有一棵树,并在此树上添加一个外部节点 没有周期 或者我们可以说 现在通过添加外部节点更改的初始树仍然是树 当然,我们现在树没有循环 对于一个节点,归纳步骤很简单 对于由K节点制成的树,也很清楚 如果添加一个节点(当然是外部节点),则仍然没有循环(请问为什么?) 通过这个简单的证明,并知道这一点,在生成生成树的第一步 通过prim的算法,我们有一棵树(因为一个节点当然是树) 所以我们要在树上添加一个外部节点,所以我们的形状当然仍然是树 我们可以说没有循环

答案 1 :(得分:0)

使 Prim 算法防止循环的原因在于,在算法执行期间,所选顶点出列。这使得您所做的假设变得不可能。

答案 2 :(得分:0)

当我们申请时 Extract-Min at step 7,它必须从 Q 中删除访问过的节点,然后在 step 9,我们检查 vertex v 是否更早被访问过。

答案 3 :(得分:-1)

这是Prim's Algorithm的eager版本,与Dijkstra非常相似,在实现过程中使用了Indexed Priority Queue。声明

<块引用>

如果节点有visited[],那么它会阻止循环,但是在下面的教科书伪代码中没有>这样的检查。

是错误的,因为如果你仔细想想,检查 if V ∈ Q 本身就是一个检查,以确定一个顶点是被访问还是未被访问。