赞
踩
先构造一个只含 n 个顶点、而边集为空的子图,把子图中各个顶点看成各棵树上的根结点,之后,从网的边集 E 中选取一条权值最小的边,若该条边的两个顶点分属不同的树(不构成回路),则将其加入子图,即把两棵树合成一棵树,反之,若该条边的两个顶点已落在同一棵树上(构成回路),则不可取,而应该取下一条权值最小的边再试之。依次类推,直到森林中只有一棵树,也即子图中含有 n-1 条边为止。
1、新建图G,G中拥有原图中相同的节点,但没有边;
2、将原图中所有的边按权值从小到大排序;
3、从权值最小的边开始,如果这条边连接的两个节点于图G中不在同一个连通分量中,则添加这条边到图G中;
4、重复3,直至图G中所有的节点都在同一个连通分量中。
关于步骤3的解释:选取的边要是剩下边权值最小的,且与G中的边不构成回路。
原图如下:
第一步:判断权值为1的连接边hg是否属于集合,由于开始集合为空,则将两个节点加入到集合,且连接该边,并判断是否属于回路;
第二步:判断权值为2的连接边ic是否属于集合,由于集合只有节点h和g,则将节点i和c加入到集合中,且连接该边,并判断是否属于回路;
第三步:判断权值为2的连接边gf是否属于集合,根据判断规则,把f加入到集合,且连接该边;
第四步:根据判断规则,将节点a和b加入到集合,且连接该边;
第五步:根据判断规则,连接该边cf;
第六步:根据判断规则,连接节点i和g时形成回路,则放弃,继续下次判断;
第七步:判断权值为7的连接边;根据判断规则,节点i和h形成回路,则放弃,将节点d加入到集合,并连接该边;
第八步:判断权值为8的连接边;根据判断规则,连接节点a和h;
第九步:判断权值为9的连接边;将节点e加入到集合,并连接该边;此时集合已经包含所有节点,则终止循环;
1、克鲁斯卡尔算法需要对图的边进行访问,所以克鲁斯卡尔算法的时间复杂度只和边有关系,可以证明其时间复杂度为O(eloge);
2、克鲁斯卡尔算法和普利姆算法一样,都是贪心算法,不同的是克鲁斯卡尔算法是从森林到树,而普利姆一直保持着一个树。
3、克鲁斯卡尔算法适合边少的,也即稀疏图。
参考文章:
【1】算法——最小生成树:Kruskal算法、Prim算法
【2】克鲁斯卡尔算法
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。