求最小树的Kruskal算法

该算法就是贪心算法,基本思想就是从图G(有n个顶点)的边集中选取n-1条权值尽量小的边,并且不构成回路。

有一个图G,该图的边集用E表示

Step1:把图的边集按权值的大小进行排列(e1,e2,e3 ........),并且置S=ф,i=0,j=1 (S代表点集)

Step2:|S|=i=n-1,则停止,这时G[S] = T即为所求;否则,转向Step3

Step3:G[ S U {ej} ]不构成回路,则ai+1 = ej,S = S U {ai+1},i = i+1, j= j+1,转向Step2

              否则j= j+1,转向Step2

 

图例:

求最小树的Kruskal算法_第1张图片

将边集排序 1     2     2     2     3    4     4     4

首先选择最短边,将其端点连接

求最小树的Kruskal算法_第2张图片




再选则剩余的最短边将其连接

 

求最小树的Kruskal算法_第3张图片

依次类推.....,但是不要构成回路

求最小树的Kruskal算法_第4张图片

 

最后当|S|=n-1时候停止(树的顶点数目比边数目多一个),这个时候最小树生成了


 最后说一下怎么回避回路的产生

为每一个顶点设一个标志位,开始的时候标志位都是 false

每当在加入一条边到S集合之前先进行一下判断,如果该边的两个顶点有一个标志位是 false 则这两个顶点可以相连,该边可以加入到集合S,并且将这两个顶点的标志位赋为 true  ;否则,即该边的两个顶点的标志位 都是true ,那么就不要把这条边加入集合S了,考虑下一条待加入的边。

你可能感兴趣的:(算法,kruskal,最小生成树算法)