最小生成树 简单入门

在这里插入图片描述

最小生成树

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

什么是最小生成树

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

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

http://www.javashuo.com/article/p-fgvmztmv-ho.html

算法

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

  • 克鲁斯卡尔( K r u s k a l Kruskal )

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

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

这是我的简单证明和模板

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