Kruskal最小生成树

#include <bits/stdc++.h>
using namespace std;
const int maxn=999999;
int n,m,pre[maxn],vis[maxn];
struct ege{//边的数组 
	int u,v,w;
}d[maxn];
bool com(ege a,ege b){//按边的权值进行排序 
	return a.w<b.w;
}
int find(int x){
	if(x!=pre[x])	pre[x]=find(pre[x]);
	return pre[x];
}
void join(int q,int w){
	pre[find(q)]=find(w);
	return;
}
int kur(){//生成树 
	for(int i=1;i<=n;i++)	pre[i]=i;
	int j=1,ans=0;
	for(int i=1;i<=n-1;i++)//找n-1条边 
	{
		for(;j<=m;j++)
		{
			if(find(d[j].u)!=find(d[j].v))
			{
				join(d[j].u,d[j].v);
				ans+=d[j].w;
				break;
			}
		}
	}
	return ans;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)	cin>>d[i].u>>d[i].v>>d[i].w;
	sort(d+1,d+1+m,com);
	cout<<kur();
}
原文地址:https://www.cnblogs.com/iss-ue/p/12679633.html