题目链接:http://poj.org/problem?id=1287
思路:最小生成树模板题
///2014.7.23
///poj1287
#include <cstdio>
#include <algorithm>
int n,m;
int sum;
const int MAXN = 55;
struct Edge{
int x,y;
int l;
};
Edge edge[MAXN*(MAXN-1)/2];
bool cmp(Edge a,Edge b){
return a.l < b.l;
}
int dSet[MAXN];
int find(int x){
while( x != dSet[x] )
x = dSet[x];
return x;
}
bool judge(Edge e){
int fx = find(e.x);
int fy = find(e.y);
if( fx == fy )
return false;
else{
dSet[fx] = fy;
return true;
}
}
void kruskal(){
sum = 0;
std::sort(edge,edge+m,cmp);
for(int i=0 ; i<n ; i++) dSet[i] = i;
int k = 0;
for(int i=0 ; k<n-1 ; i++){
if( judge(edge[i]) ){
sum += edge[i].l;
k++;
}
}
}
void init(){
scanf("%d",&m);
int a,b,c;
for(int i=0 ; i<m ; i++){
scanf("%d %d %d",&a,&b,&c);
a--,b--;
edge[i].x = a;
edge[i].y = b;
edge[i].l = c;
}
}
int main(){
while( scanf("%d",&n) && n ){
init();
kruskal();
printf("%d\n",sum);
}
return 0;
}