克鲁斯卡尔kruskal算法构造最小生成树

Kruskal算法
1.概览

Kruskal算法是一种用来寻找最小生成树的算法,Kruskal算法在图中存在相同权值的边时也有效。假设连通网N=(V,{E})。则令最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,{}),图中每个顶点自成一个连通分量。在E中选择最小代价的边,若该边依附的顶点落在T中不同的连通分量中,则将该边加入到T中,否则舍去此边而选择下一条代价最小的边,依次类推,直到T中所有顶点都在同一连通分量上为止。

2.算法简单描述

1).记Graph中有v个顶点,e个边
2).新建图Graphnew,Graphnew中拥有原图中相同的v个顶点,但没有边
3).将原图Graph中所有e个边按权值从小到大排序
4).循环:从权值最小的边开始遍历每条边 直至图Graph中所有的节点都在同一个连通分量中 ,if 这条边连接的两个节点于图Graphnew中不在同一个连通分量中, 添加这条边到图Graphnew中

克鲁斯卡尔kruskal算法构造最小生成树_第1张图片
首先第一步,我们有一张图Graph,有若干点和边

克鲁斯卡尔kruskal算法构造最小生成树_第2张图片
将所有的边的长度排序,用排序的结果作为我们选择边的依据。这里再次体现了贪心算法的思想。资源排序,对局部最优的资源进行选择,排序完成后,我们率先选择了边AD。这样我们的图就变成了上图
克鲁斯卡尔kruskal算法构造最小生成树_第3张图片
在剩下的变中寻找。我们找到了CE。这里边的权重也是5
克鲁斯卡尔kruskal算法构造最小生成树_第4张图片
依次类推我们找到了6,7,7,即DF,AB,BE。
克鲁斯卡尔kruskal算法构造最小生成树_第5张图片
下面继续选择, BC或者EF尽管现在长度为8的边是最小的未选择的边。但是现在他们已经连通了(对于BC可以通过CE,EB来连接,类似的EF可以通过EB,BA,AD,DF来接连)。所以不需要选择他们。类似的BD也已经连通了(这里上图的连通线用红色表示了)。最后就剩下EG和FG了。当然我们选择了EG。

时间复杂度:elog2e e为图中的边数

你可能感兴趣的:(数据结构与算法基础)