纯的最小生成树题,用Kruskal跑一遍即可。
代码:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
double x;
double y;
}a[101];
struct Edge
{
int from;
int to;
double val;
bool operator < (const Edge a)const
{
return val<a.val;
}
}e[10001];
int n,p[101];
double dis(double x1,double y1,double x2,double y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int find(int x)
{
if(x==p[x])
return x;
return p[x]=find(p[x]);
}
int main()
{
int cas=1;
while(scanf("%d",&n)&&n)
{
int cou=0;
for(int i=0;i<n;i++)
{
scanf("%lf%lf",&a[i].x,&a[i].y);
for(int j=0;j<i;j++)
e[cou++]=(Edge){i,j,dis(a[i].x,a[i].y,a[j].x,a[j].y)};
}
sort(e,e+cou);
for(int i=0;i<=n;i++)
p[i]=i;
double ans=0;
for(int i=0;i<cou;i++)
{
int x=find(e[i].from);
int y=find(e[i].to);
if(x!=y)
{
ans+=e[i].val;
p[x]=y;
}
}
if(cas>1)
printf("\n");
printf("Case #%d:\n",cas++);
printf("The minimal distance is: %.2lf\n",ans);
}
return 0;
}