模板——最小生成树(Kruskal)

n个点,m条边

#include<bits/stdc++.h>
using namespace std;
struct edge{
	int sta,ed,val;
}a[1000005],b[1000005];
int n,m,tot,f[1000005];
bool mmp(edge a,edge b){
	return a.val<b.val;
}
void add(int sta,int ed,int val){
	tot++;
	b[tot].sta=sta;
	b[tot].ed=ed;
	b[tot].val=val;
}
int find(int x){
	if (x==f[x]) return x;
	f[x]=find(f[x]);
	return f[x];
}
int main(){
	scanf("%d%d",&n,&m);
	for (int i=1; i<=n; i++) f[i]=i;
	for (int i=1,x,y,z; i<=m; i++){
		scanf("%d%d%d",&x,&y,&z);
		a[i].sta=x;
		a[i].ed=y;
		a[i].val=z;
	}
	sort(a+1,a+1+m,mmp);
	for (int i=1,x,y; i<=m; i++){
		x=find(a[i].sta);
		y=find(a[i].ed);
		if (x!=y){
			f[x]=y;
			add(a[i].sta,a[i].ed,a[i].val);
		}
		if (tot==n-1) break;
	}
	return 0;
}

  

posted @ 2017-10-23 15:32  |斗蜂|  阅读(140)  评论(0编辑  收藏  举报