文章目录
1.Kruskal算法介绍
克鲁斯卡尔算法可以称为“加边法”,初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边,加入到最小生成树的边集合里。
- 把图中的所有边按代价从小到大排序;
- 把图中的n个顶点看成独立的n棵树组成的森林;
- 按权值从小到大选择边,所选的边连接的两个顶点ui,viui,vi,应属于两颗不同的树,则成为最小生成树的一条边,并将这两颗树合并作为一颗树。
- 重复(3),直到所有顶点都在一颗树内或者有n-1条边为止。
总结:从小开始加,确保无回路(树)
|| 区别普利姆最小生成树算法:普利姆算法从顶点的角度为出发点。时间复杂度为O(n^2)。**更适合于稠密度更高的连通网**。 而克鲁斯卡尔算法从边的角度求最小生成树,时间复杂度为O(eloge),**更适合于稠密度更高的连通网**。
|| 判断是否会产生回路的方法为: 在初始状态下给每个顶点赋予不同的标记,对于遍历过程的每条边,其都有两个顶点,判断这两个顶点的标记是否一致,如果一致,说明它们本身就处在一棵树中,如果继续连接就会产生回路;如果不一致,说明它们之间还没有任何关系,可以连接。
2.模板实现
//最小生成树(Kruskal算法)
#include<iostream>
#include<algorithm>
using namespace std;
struct point{
int x;
int y;
int v;
}; //写结构体用来构造边
point a[10000];//存边
int cmp(const point &a,const point &b){
if(a.v