问题
用Kruskal算法求无向图UG的最小生成树。
解法
Kruskal算法是一种贪心算法,按照以下步骤操作:
(1) 初始时将无向图UG=<V,E>的边集E按照权值从小到大进行排序,设生成树的边集合为Etree=∅,点集合为Vtree=∅,初始时生成树为空;
(2) 按照边的权值从小到大遍历所有边,对于边ei,j,若将其加入边集合Etree后不会与已有的边形成环 ,则将该边加入生成树中(将ei,j加入边集Etree,将vi,vj加入点集合Vtree);若将其加入边集合Etree后与已有的边会形成环,则跳过边ei,j;
遍历边集E的所有边,算法结束。最终Etree即为无向图UG的最小生成树,而生成树的点集满足Vtree=V。
判断添加边ei,j是否会使生成树形成环的方法是:若边ei,j的两个端点vi和vj都属于生成树的点集合Vtree,则边ei,j会使生成树中增加环,跳过该边;否则边ei,j不会使生成树形成环。
下图演示无向图用Kruskal算法求解最小生成树的过程,边上的数字即为权值大小:
得到生成树为Etree=[e1,2,e3,4,e1,5,e1,3,e0,5]。
Kruskal算法的时间复杂度为O(∣E∣)。
Introduction To Algorithms
源码
Kruskal.h
Kruskal.cpp
测试
KruskalTest.cpp