0
点赞
收藏
分享

微信扫一扫

最小生成树

哈哈镜6567 2022-02-12 阅读 62

Kruskal算法

用并查集的一种贪心算法,先把每一个节点当作一棵生成树,按边权从小到大排序,每次枚举最小的边,看是否在同一棵树上

#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'|ch>'9'){if(ch == '-') f=-1 ; ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-48 ; ch=getchar();}
	return x*f;
}
int n,m;
int f[200010];
struct data{
	int u,v,w;
}e[200010];
bool cmp(data x,data y){return x.w < y.w;}
int find(int x){return f[x]==x ? x : f[x] = find(f[x]);} //路径压缩
int ans,cnt;
int flag;
int main(){
	n=read();m=read();
	for(register int i(1) ; i<=n ; i=-~i) f[i] = i;
	for(register int i(1) ; i<=m ; i=-~i) scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
	sort(e+1,e+m+1,cmp);
	for(register int i(1) ; i<=m ; i=-~i){
		if(find(e[i].u) == find(e[i].v)) continue;
		f[find(e[i].u)] = find(e[i].v);
		ans += e[i].w;
		cnt++;
		if(cnt == n-1 || cnt == m){
			flag = 1;
			break;
		}
	}
	if(flag) printf("%d\n",ans);
	else printf("orz");
	return 0;
}
举报

相关推荐

0 条评论