题目大意:给出n个坐标点,求出连接这n个点的最短的长度。
比较简单的最小生成树,把map(i,j)记录为点i和点j之间的距离即可。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
#define MAX 110
#define INF 999999999
bool s[MAX];
double dist[MAX],map[MAX][MAX];
typedef struct node
{
double x,y;
}Point;
Point p[MAX];
double Distance(Point a,Point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
void init(int n)
{
int i,j;
memset(s,false,sizeof(s));
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
map[i][j]=INF;
for(i=1;i<=n;i++)
map[i][i]=0;
}
double Prime(int n)
{
int i,j,k;
double mind,sum;
for(i=1;i<=n;i++)
dist[i]=map[1][i];
s[1]=true;
sum=0;
for(i=1;i<=n;i++)
{
mind=INF;
k=1;
for(j=1;j<=n;j++)
if(!s[j]&&dist[j]<mind)
{
k=j;
mind=dist[j];
}
s[k]=true;
sum+=dist[k];
for(j=1;j<=n;j++)
if(!s[j]&&dist[j]>map[k][j])
dist[j]=map[k][j];
}
return sum;
}
int main()
{
int m,n,i,j;
while(scanf("%d",&n)!=-1)
{
init(n);
for(i=1;i<=n;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
map[i][j]=Distance(p[i],p[j]);
printf("%.2f\n",Prime(n));
}
return 0;
}