//最小生成树:边权和最小的一棵树 #include <iostream> #include<algorithm> using namespace std; struct Edge{ int from; int to; int length; bool operator<(const Edge& e)const{ return length<e.length; } }; Edge edge[5000]; int father[100]; int height[100]; void Initial() { for(int i=0;i<100;i++) { father[i]=i; height[i]=0; } } int Find(int x) { if(x==father[x])return x; else{ return Find(father[x]); } } void Union(int a,int b) { a=Find(a); b=Find(b); if(a!=b) { if(height[a]>height[b])father[b]=a; else if(height[a]<height[b])father[a]=b; else { father[b]=a; height[a]++; } } } int Kruskal(int n,int edgenumber) { int answer=0; for(int i=0;i<edgenumber;i++) { if(Find(edge[i].from)!=Find(edge[i].to)) { Union(edge[i].from,edge[i].to); answer+=edge[i].length; } } return answer; } int main() { int n; while (cin >> n) { if(n==0)break; int edgenumber=n*(n-1)/2; for(int i=0;i<edgenumber;i++) { cin>>edge[i].from>>edge[i].to>>edge[i].length; } sort(edge,edge+edgenumber); Initial(); cout<<Kruskal(n,edgenumber)<<endl; } }