图论入门(八)Kruskal算法

转载自https://blog.****.net/saltriver/article/details/72571114

最小生成树-Kruskal算法

 

前面说过,Kruskal是从最短边着手构建最小生成树的。其基本过程是:先对图中的所有边按照权重值从小到大进行排序,然后着手选取边构建最小生成树。如果直接从小到大按顺序选取,有可能形成了环,所以对环的处理就成了核心问题。
我们还是以前面的乡镇假设光纤网络为例:

图论入门(八)Kruskal算法

 

Kruskal算法工作步骤如下:

(1) 将边进行排序。

(2) 按权重依次从小到大将边加入最小生成树。

(3) 检查新加入的边是否构成了环。

 

怎样判断构成了环?判断原理也很简单:最小生成树加入一条边从而构成环,那么这条边的两个顶点除了这条边外,必然还有另一条路径,即这两个顶点在加入这个边之前,就是连通的,或者在一个连通子图上。

因此,在G=(V,E)中,我们令最小生成树的初始状态为只有n个顶点,0条边的非连通图T=(V,{}),图中每个顶点都是一个连通子图,即有n个连通子图。依次从E中按顺序从小到大选择边,若该边的两个顶点落在T中不同的连通子图上,则将次变加入到T中,否则舍去此边,依次类推,直到T中所有顶点都在同一个连通子图上为止。

该算法的主要执行过程在最后的for循环处,find_connect函数与顶点的个数V决定,时间复杂度为O(logV),而外面是边E的循环,因此Kruskal算法的时间复杂度为O(E logV)。