ACwing(基础)--- Kruskal

Posted bingers

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACwing(基础)--- Kruskal相关的知识,希望对你有一定的参考价值。

技术图片

Kruskal算法(适用于稀疏图)

1、将所有边按权重从小到大排序 O(mlogn)
2、枚举每条边a,b,权重c O(m)
if a,b不连通
将这条边加入集合中

判断连通

  • 使用并查集来判断两个连通块是否连通
#include<iostream>
#include<algorithm>

using namespace std;

const int M = 2e5+10;
int n,m;
int fa[M];//并查集的父节点数组
struct edge { //存储边
	int a,b,w;
} edges[M];

bool cmp(edge a, edge b) {
	return a.w<b.w; //边的权重从小到大
}
void init() {
	for(int i=1; i<=n; i++) fa[i]=i;
}
int find(int x) {
	return fa[x]==x?x:fa[x]=find(fa[x]);
}

void kruskal() {
	sort(edges,edges+m,cmp);
	int res=0,cnt=0;
	for(int i=0; i<m; i++) {
		int a=edges[i].a, b=edges[i].b,w=edges[i].w;
		a=find(a),b=find(b);
		if(a!=b) { // 如果两个连通块不连通,则将这两个连通块合并
			fa[a]=b;
			res+=w;
			cnt++;
		}
	}
	if(cnt < n-1) puts("impossible");
	else cout<<res;
}
int main() {
	cin>>n>>m;
	for(int i=0; i<m; i++) {
		int a,b,w;
		cin>>a>>b>>w;
		edges[i]= {a,b,w};
	}
	kruskal();
	return 0;
}



以上是关于ACwing(基础)--- Kruskal的主要内容,如果未能解决你的问题,请参考以下文章

数据结构-图基础-kruskal

图论算法零基础最小生成树学习与总结

AcWing 算法基础课 第六讲 贪心 总结

AcWing基础算法课Level-2 第一讲 基础算法

AcWing基础算法课Level-3 第一讲 基础算法

AcWing进阶算法课Level-4 第七章 基础算法