目录
1.Kruskal算法
算法描述:(选择最小边)
- 找出最小的边
- 不构成回路
- 连接出最小生成树
图片理解:
图片步骤便于理解:
找出最小边1
接着是2
接着是4
然后是5
然后是6,因为6和5、2构成了回路,所有舍去
然后是7,7和2、1、5构成了回路,也舍去
然后是8,两条8选择一个即可,两条都选择会构成回路
然后是10,而10和8、2、1、5构成回路,所以舍去
一共7个顶点,现在有6条边,最小生成树就如图所示了
2.Prim算法
算法描述:(点连接最小边)
- 随机选取一个顶点,找出和顶点相连边中最小的边
- 找出新的顶点相连边和原先顶点集合相连边中最小的边,不构成回路
- 如此往复,连接出最小生成树
图片理解:
假设选取A为最初顶点,找出相连边A:4、8中最小的边4
新顶点B,在A:8,B:9、8、10中找到最小的8,两个8随机哪个都行
D在原先两个顶点A:8,B:9、10和自己相连边7、2、9中找到2
C在A:8,B:9、10,D:9、7,C:1中找出1
F在B:10,D:7,F:2,5中找出最小的2
G在B:10,F:5,G:6中找出最小的5
至此,所有顶点连接完毕,这就是要的最小生成树
3.Boruvka算法
算法描述:(按点顺序连接最小边)
- 随机找一个顶点,在相连的边中找出最小的边
- 新顶点在所有相连的边中找最小的边(包含之前已经相连的边)
- 接着按顺序遍历每个顶点(按顺序A、B、……)
- 连接连通分支
- 连接出最小生成树
图片理解:
按顺序从A找,4、8中找4
B在4、9、8、10找4
C在8、9、2、1中找1
D在2、8、7、9找2
E在10、7、5、6找5
F在1、9、5、2中找1
G在2、6找2
连接两个连通分支A、B和C、D、E、F、G,在8、9、8、10中找8
最小生成树连接完成
4.Reserve-delete算法
算法描述:(删除最大边)
- 找出最大的边,删除
- 如此往复,不能导致不连通
- 删到只剩n-1条边即可
- 连接出最小生成树
图片理解:
删除10
删除9,两个9删除后都连通,可以直接删除
删除其中一个8
删除7
删除6
剩下6条边,连接出最小生成树
5.Dijkstra算法
算法描述:(列表更新距离)
- 需要一个列表记录起点到各个顶点的距离和前一个顶点
- 随机找一个顶点,认为是起点,在相邻边中找出最小的边,并认为边的另一端的顶点为新顶点
- 起点相邻的顶点先更新从起点到该顶点的距离,不更新前一个顶点
- 更新完毕后,在没有前一个顶点的顶点(除起点)距离中找最小的那个更新前一个顶点
- 如此往复,直至所有顶点都有前一个顶点
- 连接成最小生成树
图片理解:
如果以A为起点,找到4,连接B,AB是最短的,B的前一个顶点认为是A
而C只是更新距离,前一个顶点未知
列表如下
然后是B相连的C、D、E
C在8和4+9中13大于8所以不更新
D更新4+8,不更新前一个顶点(目前只有AB这一条边,不走ACD)
E更新4+10,不更新前一个顶点(不走其他路)
然后在列表中找到没有前一个顶点中的最小的距离,在8、12、14中找8,认为C的前一个顶点为A,更新
B相邻的D、E
D走ABD为12,走ACD为10,更新D的距离为10
E走ABE为14无其他路走
C相邻的D、F
F走ACF为9,更新为9然后在列表中找到没有前一个顶点中的最小的距离,在10、14、9中找9,认为F的前一个顶点为C,更新然后F相邻的D、E、G
D走ACFD为18,大于10不更新
E走ACFE为14,等于14不更新
G走ACFG为11,无其他路走,更新
在10、14、11找10,更新前一个结点为C
D相邻E
E走ABDE为15,走ACDE为15,走ACFDE为25,都大于14,不更新
列表中14、11找11,前一个结点为F,更新
剩下E,更新前一个结点为F
所有结点都连接完毕,只需回溯前一个结点依次连接即可,连接成最小生成树
6.环删除算法
以下算法只是个人通过一篇博客思考总结的,至于正确性不得而知,望有人能够指正
博客来源:求最小生成树的新算法-CSDN博客
算法描述:(环中最大边一定不在最小生成树中)
- 在所有环中找到最大的那个边,删除,确保不导致不连通
- 连接成最小生成树
图片理解:
先删除最小的环中找最大的边,保证连通
ABC中的9
BCD中的9
BDE中的10
CDE中的9
DEF中的9
EFG中的6
然后在ABDC中的8删除一个
CDEF中的7删除
连接成最小生成树