#include <iostream>
#include <cstdio>
using namespace std;
#include<cmath>
#include<iomanip>
#include<algorithm>
#define N 105
int n,b[N*(N-1)/2],k;
double a[N][2];
struct point
{
double d;
int x,xx;
}p[N*(N-1)/2];
bool cmp(point a,point b)
{
return a.d<b.d;
}
void init()
{
for(int i=1;i<=n;i++)
b[i]=i;
}
int find (int x)
{
if(b[x]==x) return x;
return b[x]=find(b[x]);
}
void merge(int x,int y)
{
int ta=find(x),tb=find(y);
if(ta!=tb) b[ta]=tb;
}
double kus()
{
int u,v,i,s=0;
double ans=0;
init();
for(i=0;i<k;i++)
{
u=p[i].x;v=p[i].xx;
if(find(u)!=find(v))
{
ans+=p[i].d;
merge(u,v);
s++;
}
if(s==n-1) return ans;
}
}
int main()
{
int i,j,m=0,flag=0;
double ans;
while(cin>>n&&n)
{
k=0;
for(i=1;i<=n;i++)
cin>>a[i][0]>>a[i][1];
for(i=1;i<=n;i++)
for(j=i;j<=n;j++) (j==i哦,当n==1的时候有用)
{
p[k].x=i;p[k].xx=j;
p[k++].d=sqrt((a[i][0]-a[j][0])*(a[i][0]-a[j][0])+(a[i][1]-a[j][1])*(a[i][1]-a[j][1]));
}
sort(p,p+k,cmp);
if(flag==0) {cout<<"Case #"<<++m<<':'<<endl<<"The minimal distance is: "<<fixed<<setprecision(2)<<
kus()<<endl;flag=1;}
else {cout<<endl<<"Case #"<<++m<<':'<<endl<<"The minimal distance is: "<<fixed<<setprecision(2)<<
kus()<<endl;}
}
return 0;
}
zju1203最小生成树(克鲁斯卡尔算法)
最新推荐文章于 2025-08-24 21:29:33 发布