思路:
枚举。
对于每个已经连好的点的集合中的每个元素进行枚举,枚举这个点所能到达的所有点的最小值,记录。
直到所有的点都连进点集中。
AC代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string.h>
using namespace std;
struct node{
int x,y;
}a[60];
double di[60][60];
bool vis[60];
node done[60];
double dis(int i,int j){
if(di[i][j] != 0) return di[i][j];
node n1 = done[i];
node n2 = a[j];
return sqrt(abs( abs((n1.x-n2.x)*(n1.x-n2.x)) + abs((n1.y-n2.y)*(n1.y-n2.y))));
}
int cnt;
int main()
{
int n;
int fi,se;
double ans = 0;
while(scanf("%d",&n),n){
ans = 0;
memset(vis,false,sizeof(vis));
memset(di,0,sizeof(di));
scanf("%d%d",&fi,&se);
vis[fi] = true;
vis[se] = true;
for(int i = 1;i <= n;i++){
scanf("%d%d",&a[i].x,&a[i].y);
}
done[1] = a[fi];
done[2] = a[se];
ans += dis(1,se);
cnt = 2;
while(cnt != n){
double temp = 10000000000;
int pos1,pos2;
for(int i = 1;i <= cnt;i++){
for(int j = 1;j <= n;j++){
if(vis[j] == false){
if(dis(i,j) < temp){
temp = dis(i,j);
pos1 = i;
pos2 = j;
}
}
}
}
vis[pos2] = true;
ans += dis(pos1,pos2);
cnt++;
done[cnt] = a[pos2];
}
printf("%.2f\n",ans);
}
return 0;
}