Kruskal Kruskal算法

问题

用Kruskal算法求无向图UGUG的最小生成树。

解法

Kruskal算法是一种贪心算法,按照以下步骤操作:

(1)(1) 初始时将无向图UG=<V,E>UG = <V, E>的边集EE按照权值从小到大进行排序,设生成树的边集合为Etree=E_{tree} = \varnothing,点集合为Vtree=V_{tree} = \varnothing,初始时生成树为空;

(2)(2) 按照边的权值从小到大遍历所有边,对于边ei,je_{i,j},若将其加入边集合EtreeE_{tree}后不会与已有的边形成环 ,则将该边加入生成树中(将ei,je_{i,j}加入边集EtreeE_{tree},将vi,vjv_i, v_j加入点集合VtreeV_{tree});若将其加入边集合EtreeE_{tree}后与已有的边会形成环,则跳过边ei,je_{i,j}

遍历边集EE的所有边,算法结束。最终EtreeE_{tree}即为无向图UGUG的最小生成树,而生成树的点集满足Vtree=VV_{tree} = V

判断添加边ei,je_{i,j}是否会使生成树形成环的方法是:若边ei,je_{i,j}的两个端点viv_ivjv_j都属于生成树的点集合VtreeV_{tree},则边ei,je_{i,j}会使生成树中增加环,跳过该边;否则边ei,je_{i,j}不会使生成树形成环。

下图演示无向图用Kruskal算法求解最小生成树的过程,边上的数字即为权值大小:

得到生成树为Etree=[e1,2,e3,4,e1,5,e1,3,e0,5]E_{tree} = [ e_{1,2}, e_{3,4}, e_{1,5}, e_{1,3}, e_{0,5} ]

Kruskal算法的时间复杂度为O(E)O(| E |)

Introduction To Algorithms

源码

Kruskal.h

Kruskal.cpp

测试

KruskalTest.cpp

Last updated