这是一道=最小生成树的问题,我用的是prim算法解决的
#include<stdio.h>
#include<math.h>
#include<string.h>
#define maxn 105
struct point
{
double x,y;
}p[maxn];
double cost[maxn][maxn];
double dis(point a, point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
#define typec double
const typec inf=0x3f3f3f3f;
int vis[maxn];
double low[maxn];
double prim(double cost[][maxn],int n)
{
int i,j,p;
double min,res=0;
memset(vis,0,sizeof(vis));
vis[0]=1;
for(i=1;i<n;i++)
{
low[i]=cost[0][i];
}
for(i=1;i<n;i++)
{
min=inf;
p=-1;
for(j=0;j<n;j++)
if(!vis[j]&&min>low[j])
{
min=low[j];
p=j;
}
if(min==inf)
return -1;
res+=min;
vis[p]=1;
for(j=0;j<n;j++)
if(!vis[j]&&low[j]>cost[p][j])
{
low[j]=cost[p][j];
}
}
return res;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i==j)
{
cost[i][j]=0;
}
else
cost[i][j]=dis(p[i],p[j]);
}
}
printf("%.2f\n",prim(cost,n));
}
return 0;
}