【数据结构】 最小生成树(二)——kruskal算法

时间:2022-12-02 11:37:57

  上一期说完了什么是最小生成树,这一期咱们来介绍求最小生成树的算法:kruskal算法,适用于稀疏图,也就是同样个数的节点,边越少就越快,到了数据结构与算法这个阶段了,做题靠的就是速度快,时间复杂度小。

  网上一搜就知道大家都会先介绍prim算法,而我为什么不介绍prim算法呢?因为小编认为这个算法理解快,也很容易明白,可以先做个铺垫(小编绝不会告诉你小编是因为不会才不说的),kruskal算法核心思想是将一棵棵树林(也可以理解成子树)合并成一棵大树,具体做法如下:将一个连通图中不停寻找最短的边,如果不与已经在集合中的边形成回路就把这条边放入最小生成树的集合中,如果形成就不理他了呗,这样反复下去就OK了,下面是一段演示过程:

                                            【数据结构】 最小生成树(二)——kruskal算法

                                             【数据结构】 最小生成树(二)——kruskal算法

                                              【数据结构】 最小生成树(二)——kruskal算法

                                           【数据结构】 最小生成树(二)——kruskal算法

                                               【数据结构】 最小生成树(二)——kruskal算法

                                          【数据结构】 最小生成树(二)——kruskal算法

  这条边发生了回路,就不要了。

                                          【数据结构】 最小生成树(二)——kruskal算法

到此时已有5条边进入集合了,共有6个顶点此时已大功告成,就要结束循环,不必再寻找了。

下面是一段伪代码:

//假设MST[]是最小生成树的集合,cnt表示是存入集合的边数 
while(cnt<n-1)//共有n-1条边
{
    在图中找出最短的一条边;
    if(添加这条边不产生回路) 
    {
        加入MST集合;
        cnt++; 
    } 
} 

  找出图中最短边自然是容易的,实在不行直接暴力过一遍,无疑,是否产生回路是一个重难点,此时就要用到并查集了(不会并查集的点这里传送门),这里要使用路径压缩,只要祖先相同就能判断在同一集合中,如果不在同一集合则合并,否则就不用这条边了,直到凑够n-1条边为止。

  这一期讲述了kruskal算法,下一期将会介绍prim算法,欲知后事如何,且听下回分解。

专栏:

【数据结构】 最小生成树(一)——什么是最小生成树?

【数据结构】 最小生成树(二)——kruskal算法

【数据结构】 最小生成树(三)——prim算法

【数据结构】 最小生成树(四)——利用kruskal算法搞定例题×3+变形+一道大水题