Kruskal算法求最小生成树 笔记与思路整理

两盒软妹~` 提交于 2019-11-28 07:56:33

 

整理一下前一段时间的最小生成树的算法。(其实是刚弄明白

Kruskal其实算是一种贪心算法。先将边按权值排序,每次选一条没选过的权值最小边加入树,若加入后成环就跳过。

先贴张图做个示例。

(可视化均来自VisuAlgo)

1、邻接链表:

Edge From To     Val  
1 0 1 9
2 0 2 75
3 1 2 95
4 1 3 19
5 2 3 51
6 1 4 42
7 3 4 31

        

 

 

        

 

 

2、按权值排序(可以直接写个cmp,sort()结构体):

Edge From To     Val  
1 0 1 9
4 1 3 19
7 3 4 31
6 1 4 42
5 2 3 51
2 0 2 75
3 1 2 95

 

 

 

 

 

 

3、依次选边,若成环则跳过,否则加入最小生成树并计数。

  这里判断是否成环用的是并查集:如果新加入的边两个端点在同一个集合中,就说明已经有一条路径联通这两个端点。

4、重复3,直到加入了n-1条边或遍历完成(无最小生成树)。

选取1号、4号、7号后:

选取6号(1--4),成环,跳过;

加入5号(2--3),达到n-1条,最小生成树形成。

代码实现晚上再写。

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