算法分析与设计 MST kruskal

爷,独闯天下 提交于 2020-03-01 12:01:02

算法分析与设计

最小生成树 kruskal算法

问题描述:

一个带权连通图,其中顶点集合为V,边集合为E,任选一些点∈V,边∈E,这些点,边构成的新图连通性不变并且边权最小。
下面是百度百科给出的描述:
在一给定的无向图G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即),而 w(u, v) 代表此边的权重,若存在 T 为 E 的子集(即)且为无循环图,使得 在这里插入图片描述的 w(T) 最小,则此 T 为 G 的最小生成树。

算法思路:

kruskal:
假设 WN=(V,{E}) 是一个含有 n 个顶点的连通网,则按照克鲁斯卡尔算法构造最小生成树的过程为:先构造一个只含 n 个顶点,而边集为空的子图,若将该子图中各个顶点看成是各棵树上的根结点,则它是一个含有 n 棵树的一个森林。之后,从网的边集 E 中选取一条权值最小的边,若该条边的两个顶点分属不同的树,则将其加入子图,也就是说,将这两个顶点分别所在的两棵树合成一棵树;反之,若该条边的两个顶点已落在同一棵树上,则不可取,而应该取下一条权值最小的边再试之。依次类推,直至森林中只有一棵树,也即子图中含有 n-1条边为止。
具体步骤可以参照下面的样例
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
假设有m条边,将所给出的m条边的权值从小到大排序,从小的边开始建树,如果这条边的两端定点没有处于一棵树中,那么就将这两端顶点的树合并。否则就跳过这条边,直到构成一颗最小生成树。
如图2 所示AB边为权值最小的边之一,将AB顶点构成一颗树。图3同上。权值第三小的边是AE,但是由于AE处于一棵树中,所以遍历下一条边,如图4所示。接下来的步骤同上,直到构成图6所示最小生成树。

核心伪代码:

kruskal{
	sort(E+1,E+m+1)
	for i <-1 to m 1.do 
	从小到大遍历边,将不属于一棵树的两个顶点放在一个并查集中,重复下去,直至构成MST。 
	end
}


时间复杂度:

kruskal算法中主要对m条边进行排序,sort的话时间复杂度是O(mlogm),遍历m条边复杂度为O(m)综上分析得到算法复杂度为O(mlogm)。

源码:

github:https://github.com/SpiritDemon-max/myText/blob/master/kruskal.cpp

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!