Kruskal模板

#include<iostream>

using namespace std;
#define MAX_N 111

struct edge{
	int from,to;
	long long cost;
}E[MAX_N*MAX_N];

bool cmp(edge a,edge b){
	return a.cost<b.cost;
}

int M,N;
int father[MAX_N];

void init(){
	for(int i=1;i<=N;i++){
		father[i]=i;
	}
}

int Find(int x){
	if(x==fahter[x]) return x;
	return father[x]=Find(father[x]);
}

bool Same(int x,int y){
	return Find(x)==Find(y);
}

void unionSet(int x,int y){
	int u=Find(x);
	int v=Find(y);
	if(u==v) return;
	father[u]=v;
}

void Kruskal(){
	long long res=0;
	std::sort(E+1,E+1+M,cmp);
	for(int i=1;i<=N;i++){
		if(Same(E[i].from,E[i].to)) continue;
		unionSet(E[i].from,E[i].to);
		res+=E[i].cost;
	}
	return res;
}

int main(){
	while(scanf("%d %d",&M,&N)==2){
		if(M==0) break;
		init();
		for(int i=1;i<=N;i++){
			scanf("%d%d%lld",&E[i].from,&E[i].to,&E[i].cost);
		}
		long long res=Kruskal();
		for(int i=1;i<=N;i++){
			if(!Same(i,1))
				res=-1;
			else 
				printf("%lld",res);
		}
	}
	return 0;
}

点赞