最小生成树 简单入门

最小生成树

建图是图论基础
https://blog.csdn.net/nuoyanli/article/details/88842395

什么是最小生成树

最小生成树:任何只由GG的边构成,并包含GG的所有顶点的树称为GG的生成树(GG连通). 加权无向图GG的生成树的代价是该生成树的所有边的代码(权)的和. 最小代价生成树是其所有生成树中代价最小的生成树。

可以看啊哈算法理解 或者 参考这个博客

https://blog.csdn.net/luoshixian099/article/details/51908175

算法

  • 普利姆(PrimPrim
    此算法可以称为“加点法”,每次迭代选择代价最小的边对应的点,加入到最小生成树中。算法从某一个顶点ss开始,逐渐长大覆盖整个连通网的所有顶点。
    图的所有顶点集合为VV
    初始令集合u=s,v=Vuu={s},v=V−u;
    在两个集合u,vu,v能够组成的边中,选择一条代价最小的边(u0,v0)(u_0,v_0),加入到最小生成树中,并把v0v_0并入到集合uu中。
    重复上述步骤,直到最小生成树有n1n-1条边或者nn个顶点为止。

  • 克鲁斯卡尔(KruskalKruskal)

假设WN=(V,E)WN=(V,{E})是一个含有nn个顶点的连通网,则按照克鲁斯卡尔算法构造最小生成树的过程为:先构造一个只含n个顶点,而边集为空的子图,若将该子图中各个顶点看成是各棵树上的根结点,则它是一个含有n棵树的一个森(摘自 nocownocow

KruskalKruskal算法(克鲁斯卡尔算法):(如果想要边的总长度之和最短,我们自然可以想到首先先选最短的边)将所有的边排序,从最小的边开始选,每次连通最小的边,不能形成回路,所以就要求判断两点间是否已经连通。为了优化操作,我们这里用并查集优化,判断其是否在一个树上。如果不在一个树上,就加进去,继续添加,直到所有的边都在一个集合即可(连通)。
时间复杂度为O(mlogm)O(mlogm)

这是我的简单证明和模板

https://blog.csdn.net/nuoyanli/article/details/88662568

相关文章: