http://acm.hdu.edu.cn/showproblem.php?pid=4463
//题意是找到n个商店相连的最短距离,耐克和苹果店必须相连
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
const int N=60;
const int MaxDist=INT_MAX;
struct f
{
double x;
double y;
}s[N];
double mat[N][N],dist[N];
int n;
bool visit[N];//记录该点是否已连入
double prim()
{
int i,j,carry2=0;//carry2记录临时点
double carry1,sum=0;//carry1记录临时距离
fill(dist,dist+N,0);
fill(visit,visit+N,false);
for(i=0;i<n;i++)dist[i]=mat[i][0];
visit[0]=true;
for(i=0;i<n;i++)
{
carry1=MaxDist;
for(j=0;j<n;j++)
{
if(carry1>dist[j]&&visit[j]==false)
{
carry1=dist[j];
carry2=j;
}
}
if(carry1==MaxDist)break;
visit[carry2]=true;
sum+=carry1;
for(j=0;j<n;j++)
{
if(dist[j]>mat[carry2][j]&&visit[j]==false)
{
dist[j]=mat[carry2][j];
}
}
}
return sum;
}
int main()
{
int p,q,i,j;
double x,y;
while(cin>>n,n)
{
cin>>p>>q;
p--;
q--;
for(i=0;i<n;i++)
{
cin>>s[i].x>>s[i].y;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
x=s[i].x-s[j].x,y=s[i].y-s[j].y;
mat[i][j]=sqrt(x*x+y*y);
}
}
double carry=mat[p][q];
mat[p][q]=mat[q][p]=0;//先将p,q两点间距离致零,保证一定相连
printf("%.2lf\n",prim()+carry);
}
return 0;
}