#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
int x,y,value;
}city[102*102];//结构体记录城市和之间的权值
int father[102];//用于标记某个城市的根是那个城市
int n;
int num[102];//用于记录每棵树上的节点有多少
bool cmp(node a,node b)
{
return a.value<b.value;//升序排列
}
void init()//初始化
{
for(int i=1;i<=n;i++)
{
father[i]=i;num[i]=1;
}
}
int find_root(int son)//找根节点
{
if(son!=father[son])//使用递归方法
{
father[son]=find_root(father[son]);
}
return father[son];
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
for(int i=1;i<=n*(n-1)/2;i++)
{
scanf("%d%d%d",&city[i].x,&city[i].y,&city[i].value);
}
init();
sort(city+1,city+n*(n-1)/2+1,cmp);
int fx,fy,max=0;
for(int i=1;i<=n*(n-1)/2;i++)
{
fx=find_root(city[i].x);
fy=find_root(city[i].y);
if(fx!=fy)//只要根节点不相同,说明就不是一棵树上的,那么只要把他们连在一起,并加上权值就是使用最小的费用
{
father[fy]=fx;
max+=city[i].value;
}
if(num[fx]==n||num[fy]==n)//小优化:如果一棵树上满足有所有的节点,说明所有的城市都连在一起,停止就可以了
break;
}
printf("%d\n",max);
}
return 0;
}
#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
int x,y,value;
}city[102*102];//结构体记录城市和之间的权值
int father[102];//用于标记某个城市的根是那个城市
int n;
int num[102];//用于记录每棵树上的节点有多少
bool cmp(node a,node b)
{
return a.value<b.value;//升序排列
}
void init()//初始化
{
for(int i=1;i<=n;i++)
{
father[i]=i;num[i]=1;
}
}
int find_root(int son)//找根节点
{
if(son!=father[son])//使用递归方法
{
father[son]=find_root(father[son]);
}
return father[son];
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
for(int i=1;i<=n*(n-1)/2;i++)
{
scanf("%d%d%d",&city[i].x,&city[i].y,&city[i].value);
}
init();
sort(city+1,city+n*(n-1)/2+1,cmp);
int fx,fy,max=0;
for(int i=1;i<=n*(n-1)/2;i++)
{
fx=find_root(city[i].x);
fy=find_root(city[i].y);
if(fx!=fy)//只要根节点不相同,说明就不是一棵树上的,那么只要把他们连在一起,并加上权值就是使用最小的费用
{
father[fy]=fx;
max+=city[i].value;
}
if(num[fx]==n||num[fy]==n)//小优化:如果一棵树上满足有所有的节点,说明所有的城市都连在一起,停止就可以了
break;
}
printf("%d\n",max);
}
return 0;
}