图解
#include <iostream>
using namespace std ;
const int INF=0x3ffffff;
int map[128][128];
int used[128];
int dis[128];
void inti() //初始化
{
for(int i=0;i<128;i++)
{
for(int j=0;j<128;j++)
{
map[i][j]=INF;
}
dis[i]=INF;
}
memset(used,0,sizeof(used));
}
int prim(int n)
{
dis[1]=0;
int sum=0; //记录权值
for(int i=1;i<=n;i++)
{
int min=INF;
int index=0;
//找到最小的并且木有被标记过的边
for(int j=1;j<=n;j++)
{
if(min>dis[j] && !used[j])
{
min=dis[j];
index=j;
}
}
//若找不到最小边,说明松弛结束(或者图本身就不连通)
if(index==0)
return -1;
sum+=dis[index];
//标记用过的边
used[index] = 1;
//开始松弛操作
for(j=1;j<=n;j++)
{
if(dis[j] > map[index][j] && map[index][j]!=INF)
{
dis[j]=map[index][j];
}
}
}
return sum;
}
int main()
{
int n;
while(1)
{
inti();
cin >> n;
if(n==0) break;
int a,b,c;
for(int i=0;i<n*(n-1)/2;i++)
{
cin >> a >> b >> c ;
if(map[a][b]==INF || map[a][b]>c)
{
map[a][b]=c;
map[b][a]=c;
}
}
cout << prim(n) << endl;
}
return 0;
}