hihoCoder 1098

题目大意:n 个城市由 m 条边连接,每条边有权值,求将所有城市连接起来时的最小权值和。

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int n,m;
int u[1000010],v[1000010],w[1000010],f[100010],r[1000010];

int cmp(const int x,const int y){
	return w[x] < w[y]; // zhuyi < 
}

int find(int x){
	return x == f[x] ? x : f[x] = find(f[x]);
}

int main(){
	int i,j,ans;
	while(scanf("%d%d",&n,&m) == 2){
		ans = 0 ;
		for(i=0;i<m;i++)
			scanf("%d%d%d",&u[i],&v[i],&w[i]);
		for(i=0;i<m;i++)
			r[i] = i;
		for(i=0;i<n;i++)
			f[i] = i;
		sort(r,r+m,cmp); 
		int cnt = 0;
		for(i=0;i<m && cnt <= n;i++){
			int x = find(u[r[i]]);
			int y = find(v[r[i]]);
			if(x == y)
				continue;
			f[x] = y;
			ans += w[r[i]];
			cnt ++ ;
		}
		printf("%d\n",ans);
	}
	return 0;
}
posted @ 2015-10-06 13:50  阿文的博客  阅读(157)  评论(0)    收藏  举报