解题思路:
最小生成树。
用一个数组进行标记,查找所有的最短路径,累加记录,再一次循环查找即可。
程序:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct In
{
int a;
int b;
int len;
}s[5000];
int cmp(const void *p,const void *q)
{
return (*(In *)p).len - (*(In *)q).len;
}
int main()
{
int n,i,temp,ans,flag,h[120];
while(scanf("%d",&n),n)
{
temp=n*(n-1)/2;
for(i=0;i<temp;i++)
{
scanf("%d %d %d",&s[i].a,&s[i].b,&s[i].len);
}
qsort(s,temp,sizeof(s[0]),cmp); //按照距离由小到大排序。
// for(i=0;i<temp;i++)
// printf("%d %d %d\n",s[i].a,s[i].b,s[i].len);
for(i=1;i<=n;i++)
{
h[i]=1;
}
h[s[0].a]=0;
ans=0;
for(i=0;i<temp;i++)
{
flag=h[s[i].a]+h[s[i].b];
if(flag==1) //已经联通的就不必要了。
{
ans+=s[i].len;
h[s[i].a]=h[s[i].b]=0;
i=0; // 要重新开始查找,直到所有的路都查找完毕。
}
}
printf("%d\n",ans);
}
return 0;
}