Kruskal - Kruskal算法


问题

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

解法

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

初始时将无向图的边集按照权值从小到大进行排序,设生成树的边集合为,点集合为,初始时生成树为空;

按照边的权值从小到大遍历所有边,对于边,若将其加入边集合后不会与已有的边形成环 ,则将该边加入生成树中(将加入边集,将加入点集合);若将其加入边集合后与已有的边会形成环,则跳过边

遍历边集的所有边,算法结束。最终即为无向图的最小生成树,而生成树的点集满足

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

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

Kruskal1.png

得到生成树为

Kruskal算法的时间复杂度为


Introduction To Algorithms


源码

Kruskal.h

Kruskal.cpp

测试

KruskalTest.cpp