题意:输入n个城市的坐标,输出使n个城市连通的最短路线的长度
分析:通过坐标可以将两两之间的长度即权值算出,再用最小生成树的算法
不过这个题要注意输出时的格式问题,两组数据间要空一行
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int f[110],n,m;
struct stu
{
int a,b;
double c;
}t[5000];
int cmp(struct stu x,struct stu y)
{
return x.c<y.c;
}
int find(int x)
{
if(x!=f[x])
f[x]=find(f[x]);
return f[x];
}
double krus()
{
int i,k=0,x,y;
double s;
for(i=1;i<m;i++){
x=find(t[i].a);
y=find(t[i].b);
if(x!=y){
s+=t[i].c;
k++;
if(k==n-1)
break;
f[x]=y;
}
}
return s;
}
int main()
{
int i,j,k=0;
double s,x[110],y[110];
while(scanf("%d",&n)!=EOF){
if(n==0)
break;
if(k>=1)
printf("\n");
k++;
for(i=1;i<=n;i++){
scanf("%lf%lf",&x[i],&y[i]);
f[i]=i;
}
m=1;
for(i=1;i<=n;i++)
for(j=1;j<i;j++){
t[m].a=i;
t[m].b=j;
t[m++].c=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); //计算两两间的距离
}
sort(t+1,t+m,cmp);
s=krus();
printf("Case #%d:\nThe minimal distance is: %.2lf\n",k,s);
}
return 0;
}