算法分析与设计
最小生成树 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
来源:CSDN
作者:Erwin_Cat
链接:https://blog.csdn.net/Erwin_Cat/article/details/104582369