(step6.1.5)hdu 1233(还是畅通工程——最小生成树)

题目大意:输入一个整数n,表示有n个村庄,在接下来的n*(n-1)/2中,每行有3个整数beigin、end、weight,分别表示路的起始村庄,结束村庄和村庄之间的距离。

求索要修的路的最短距离


解题思路:最小生成树(克鲁斯卡尔算法实现)。。。

PS:更详细的说明在上一篇博客中有


代码如下:

/*
 * 1233_1.cpp
 *
 *  Created on: 2013年8月26日
 *      Author: Administrator
 */

#include <iostream>

using namespace std;

struct edge{
	int begin;
	int end;
	int weight;
};

const int maxn = 6000;
int father[maxn];
edge e[maxn*maxn];

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

	father[x] = find(father[x]);
	return father[x];
}

int kruscal(int count){
	int i;
	int sum = 0;

	for( i = 1 ; i < maxn ; ++i){
		father[i] = i;
	}

	for( i = 0 ; i < count ; ++i ){
		int fx = find(e[i].begin);
		int fy = find(e[i].end);

		if(fx != fy){
			father[fx] = fy;
			sum += e[i].weight;
		}
	}

	return sum;
}

bool compare(const edge& a , const edge& b){
	return a.weight < b.weight;
}

int main(){
	int n;
	while(scanf("%d",&n)!=EOF,n){
		int i;
		int m = n*(n - 1)/2;
		memset(father,0,sizeof(father));//尽量加上,否则可能会出现一些问题

		for(i = 0; i < m ; ++i){
			scanf("%d%d%d",&e[i].begin,&e[i].end,&e[i].weight);
		}

		sort(e, e + m , compare);

		int sum = kruscal(m);

		printf("%d
",sum);
	}
}