图论——最小生成树——Kruskal算法

最小生成树的基础算法比最短路的简单114514倍

前面说了一个适用于稠密图的算法,这次来说一说一个适用于稀疏图的最小生成树算法——Kruskal算法,老土话叫克鲁斯卡尔算法。

同样,它的实现也很简单,还是经典三步:

1、将所有边按从小到大顺序排序(啊哈哈,终于不是初始化了)。

2、枚举每条边,设a已经确定(在最小生成树的集合中),b是与a相连的边,权值是c。

3、判断,如果a,b不连通,将b加到集合中。

完了。

最后,考虑时间复杂度:排序时间复杂度为O(m*log2m),枚举时间复杂度为O(m),忽略常数就是O(m*log2m)

模板代码,这里用的是类似于并查集的方式:

int find(int x) {
	if(p[x]!=x) p[x]=find(p[x]);
	else return x;
}
int res=0,cnt=0;
for(int i=1; i<=m; i++) {
	int a=edges[i].a,b=edges[i].b,w=edges[i].w;
	if(find(a)!=find(b)) {
		p[find(a)]=p[find(b)];
		cnt++;
		res+=w;
	}
}
posted @ 2022-07-23 18:18  唯私の超电磁砲  阅读(46)  评论(0编辑  收藏  举报