title

kruskal

#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<queue>
#include<vector>
#include<map>
#include<stack>
#define N 400010
using namespace std;
struct edge{
	int u,v,w;
} e[N];
int n,m,ans,f[N],cnt;
inline int read(){
	int f=0,x=0;
	char ch=getchar();
	while(!isdigit(ch)) f|=(ch=='-'),ch=getchar();
	while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return f?-x:x;
}
inline bool cmp(edge a,edge b){
	return a.w<b.w;
}
inline int find(int v){
	return f[v]==v?v:f[v]=find(f[v]);
}
inline bool merge(int x,int y){
	int t1=find(x);
	int t2=find(y);
	if(t1!=t2){
		f[t2]=t1;
		return true;
	}
	return false;
}
int main(){
	n=read();
	m=read();
	for(int i=1; i<=n; i++) f[i]=i;
	for(int i=1; i<=m; i++){
		e[i].u=read();
		e[i].v=read();
		e[i].w=read();
	}
	sort(e+1,e+m+1,cmp);//一定要e+m+1 不然无法遍历所有边 
	for(int i=1; i<=m; i++){
		if(merge(e[i].u,e[i].v)){
			cnt++;
			ans+=e[i].w;
		}
		if(cnt==n-1) break;
	}
	if(cnt==n-1)
		printf("%d",ans);
	else printf("orz");
	return 0;
}
posted @ 2018-09-10 01:03  Horrigue_JyowYang  阅读(87)  评论(0编辑  收藏  举报