所以我目前正在尝试一些算法并且遇到了Kruskals算法。
理解概念,了解如何做实际过程。但是不明白算法。
以下是算法:
据我所知,| V |是所有的顶点?
什么是E'? 我不知道为什么这个算法让我如此困惑,我已经非常轻松地选择了其他算法
答案 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'
边的情况下终止,例如当图不是一个连接的组件时。