标签:
#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
#define INF 0x3f3f3f3f
#define MAX 101
double c[MAX][MAX];
double dis[MAX],visit[MAX];
typedef struct point
{
double x;
double y;
}Point;
//求两点之间的距离
double getDistance(Point a,Point b)
{
double len;
len=sqrt(1.0*(a.x-b.x)*(a.x-b.x)+1.0*(a.y-b.y)*(a.y-b.y));
return len;
}
int main()
{
Point p[105];
int i,j,k,n;
double sum,l;
while(cin >> n)
{ //输出坐标点
for(i=1;i<=n;i++)
cin >> p[i].x >> p[i].y;
//初始化所有点之间的距离
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
{
if(i==j)c[i][j]=0;
else c[i][j]=INF;
}
//初始化各个点之间的距离
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
{
l=getDistance(p[i],p[j]);
c[i][j]=c[j][i]=l;
}
//初始化起始点到各点的距离
for(i=1;i<=n;i++)
{
dis[i]=c[1][i];
visit[i]=0;
}
//标记1点已经查过
visit[1]=1;
sum=0;
for(i=1;i<n;i++)
{
double minlen=1.0*INF;
//找到与i点到其他点k最短的路径
for(j=1;j<=n;j++)
if(visit[j]==0 && dis[j]<minlen)
{
minlen=dis[j];
k=j;
}
sum+=minlen;
//将k点标记查过
visit[k]=1;
for(j=1;j<=n;j++)
if(visit[j]==0 && dis[j]>c[j][k])dis[j]=c[j][k];
}
// cout << sum << endl;
printf("%.2f\n",sum);
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/2016zhanggang/p/5641769.html