(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\n",sum);

	}

}




 

 

你可能感兴趣的:(最小生成树)