C++ 最小生成树模板 Kruskal算法

最小生成树 Kruskal算法

还有一个Prim算法,以后补上

#include <iostream>
#include <algorithm>
#define debug(x) cout << #x << ": " << x << endl; 
const int maxn = 1000001;
int father[maxn];//father数组存放的是父亲结点

using namespace std;


struct Edge{
	int u; //左端点
	int v; //右端点
	int dis; //权值
}ed[maxn];


bool cmp(Edge a,Edge b){ // 结构体排序
	return a.dis < b.dis;
}
void init(int n){ // 初始化
	for(int i=1;i<=n;i++)
		father[i] = i;
}
int find_father(int x){ // 并查集核心操作
	if(x == father[x]) return x;
	int temp = find_father(father[x]);// 路径压缩
	return temp;
}
int Kruskal(int n,int m){
	int ans = 0; // 记入最小生成树的权值
	int num_Edge = 0;//边的数目
	for(int i = 0; i < m; i++){
		int fu = find_father(ed[i].u);//找最终父亲
		int fv = find_father(ed[i].v);//找最终父亲
		if(fu != fv){
			father[fu] = fv;//合并
			ans += ed[i].dis;
			num_Edge++;
			if(num_Edge == n-1) break;
		}
	}
	if (num_Edge != n-1) return -1;//退出条件
	else return ans;
}
int main(){
	int n, m;
	while (cin >> n >> m) {
		init(n);
		for (int i=0;i<m;i++) 
			cin >> ed[i].u >> ed[i].v>> ed[i].dis; //输入
		sort(ed, ed+m, cmp); //排序
		cout << Kruskal(n, m) << endl;
	}
	return 0;
}

参考自 CSDN:https://blog.csdn.net/qq_49786613/article/details/115309103

本文标题:《C++ 最小生成树模板 Kruskal算法》作者:Scar
原文链接:https://cxk.me/post/10.html
特别注明外均为原创,转载请注明。

分享到微信

扫描二维码

可在微信查看或分享至朋友圈。

上一篇: C++ 并查集模板

相关文章

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。