整理一下前一段时间的最小生成树的算法。(其实是刚弄明白
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条,最小生成树形成。
代码实现晚上再写。