题目大意:输入一个整数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);
}
}