没啥说的,计算点之间的距离,然后 最小生成树。。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
int parent[101];
int root(int p)
{
if(parent[p]==-1) return p;
else return parent[p]=root(parent[p]);
}
void merge(int a,int b)
{
a=root(a);
b=root(b);
parent[a]=b;
}
struct pos{
int a,b;
double len;
}p[5050];
struct dian
{
double x,y;
}di[101];
int comp(const void *a,const void *b)
{
if((((struct pos *)a)->len)-(((struct pos *)b)->len)>0)
return 1;
else return -1;
}
double dis(struct dian a,struct dian b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int main()
{
int i,j,k;
int n,a,b,c,q;
while(scanf("%d",&n)!=EOF)
{
int flag=0;
memset(parent,-1,sizeof(parent));
for(i=1;i<=n;i++)
{
scanf("%lf%lf",&di[i].x,&di[i].y);
}
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
{
p[flag].a=i;
p[flag].b=j;
p[flag].len=dis(di[i],di[j]);
flag++;
}
double sum=0;
qsort(p,flag,sizeof(struct pos),comp); //一般用sort
for(i=0;i<flag;i++)
{
if(root(p[i].a)!=root(p[i].b))
{
merge(p[i].a,p[i].b);
sum+=p[i].len;
}
}
printf("%.2lf\n",sum);
}
}