目录
一、Kruskal 算法简介
1.1 Kruskal 算法思想
Kruskal(克鲁斯卡尔)算法是一种用来在加权连通图中寻找最小生成树的算法,其操作对象是边。
Kruskal 思想:
1. 从加权图中找出所有的边;初始时,所有边都不属于最小生成树,最小生成树为。
2. 从不属于最小生成树的边中找到权值最小的边,判断最小边及其连接的两个顶点加入到最小生成树是否会形成环路。
a)若不形成环路,则将此最小边及其连接的顶点并入最小生成树;
b)若形成环路,则永远不再看此边,然后从剩下的且不属于最小生成树的边中,寻找权值最小的边。
3. 重复上述步骤,直至所有顶点均连接在一起,并没有形成环路时,最小生成树就找到了。
1.2 Kruskal 过程图解
举例:
1.3 Kruskal 两个核心问题
问题1 如何寻找权值最小的边
应对策略:对图的所有边按照权值大小进行排序,然后按从小到大的顺序取出边。
*在这里,通常定义一种存储边及其连接的顶点的结构体数组。
问题2 如何判断边及其顶点加入最小生成树是否会形成回路。
应对策略:每条边机及其相连的顶点都视作一颗子树,然后判断这课子树的根是否和最小生成树的根相同;若相同,则会形成回路;若不同,则不会形成回路,将子树并入最小生成树。
1.4 适用场景(Kruskal 与 Prime 的比较)
1. Kruskal 算法 是将边作为操作对象,当加权图的边越多,要处理的边也越多,则算法的时间复杂度就越高;而顶点的数量对算法的时间复杂度无影响。所以,Kruskal 算法适合处理稀疏图(边较少的图)。时间复杂度:O(