Kruskals算法解释

时间:2016-05-18 18:22:31

标签: algorithm

所以我目前正在尝试一些算法并且遇到了Kruskals算法。

理解概念,了解如何做实际过程。但是不明白算法。

以下是算法:

enter image description here

据我所知,| V |是所有的顶点?

什么是E'? 我不知道为什么这个算法让我如此困惑,我已经非常轻松地选择了其他算法

1 个答案:

答案 0 :(得分:2)

Kruskal的算法按重量顺序为MST添加边缘,除非它们引入一个循环(此检测通常使用 union-find 完成)。代码首先初始化一些值:

CREATE PROCEDURE Procedure_UserLogin
    @username varchar(50),
    @pwd varchar(50),
    @responseMessage INT OUTPUT
AS
BEGIN
    SET NOCOUNT ON

    DECLARE @userID INT

    IF EXISTS(SELECT TOP 1 username FROM userInfo WHERE username=@username)
    BEGIN
        open symmetric key key1
        decryption by certificate namecert
        SET @userID=(SELECT username FROM userInfo WHERE username=@username AND encryptedpwd=(ENCRYPTBYKEY(KEY_GUID('key1'),@pwd)))
        IF (@userID IS NULL)
            SET @responseMessage=0 /*INAVLID PASSWORD*/
        ELSE
            SET @responseMessage=1  /*VALID USERNAME AND PASSWORD*/
    END
    ELSE
        SET @responseMessage=2 /*INVALID USERNAME*/
END

循环条件是:

n := |V|  // the number of vertices
E' := ∅   // the edges in our MST; it starts as the empty set
Cands = E // the edges still under consideration for adding to the MST, starts as all edges

也就是说,只要我们选择了少于while |E'| < n - 1 and Cands != ∅ do 个边缘,我们就会继续(因为我们知道这是任何生成树中包含的边数:如果我们找到了它们,我们就完成了)我们尚未考虑的边缘集合不是空的。

第(1)和(2)行找到n - 1中的最小权重边缘,将其从集合中删除。 Cands的合适结构将是一个小堆,在这种情况下,这只是一个弹出操作。

第(3)和(4)行确定我们从(1)中的Cands检索的边是否会在Cands中引入一个循环(如果添加)。如果没有,我们知道这个边缘在MST中,否则它不是。

最后一行只是检查我们是否真的找到了一棵树。循环可能在没有找到E'边的情况下终止,例如当图不是一个连接的组件时。