参考链接:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/30/2615542.html
#include<iostream>
#include<cstring>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN= 5000;
int vec[MAXN][MAXN];
int vis[MAXN];
int dis[MAXN];
int n;
int ans=0;
void prim(int be){
vis[be]=1;
for(int i=1;i<=n;i++){//与最短路不一样,这里循环必须到 n
int k=1e9-1;
be=-1;
for(int i=1;i<=n;i++){
if(!vis[i] && dis[i]<k){
k=dis[i];
be=i;
}
}
//如果 be 等于-1;循环结束
if(be==-1){
return -1;
}
ans+=dis[be];
vis[be]=1;
for(int i=1;i<=n;i++){
dis[i]=min(dis[i],vec[be][i])//dis[i]表示点 i 和集合中所有点的最近距离;
}
}
}
int main(){
while(scanf("%d",&n), n){
ans=0;
memset(vec,INF,sizeof(vec));
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++){
vec[i][i]=0;
dis[i]=vec[1][i];//在这里,默认集合中的第一个点为 1 ,dis[1] 为零,
}
int a,b,c;
for(int i=1;i<=n*(n-1)/2;i++){
scanf("%d%d%d",&a,&b,&c);
vec[a][b]=min(vec[a][b],c);
vec[b][a]=min(vec[b][a],c);
}
prim(1);
cout<<ans<<endl;
}
return 0;
}