2012杭州签到题。。。
#include "stdio.h"
#include "string.h"
#include "math.h"
int main()
{
int hash[101];
int w,i,j,n,a,b,k;
double ans,min;
double dis[101],map[101][101];
int x[101],y[101];
while (scanf("%d",&n)!=EOF)
{
if (n==0) break;
scanf("%d%d",&a,&b);
for (i=1;i<=n;i++)
scanf("%d%d",&x[i],&y[i]);
ans=(double) sqrt((double) (x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]));
memset(hash,0,sizeof(hash));
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
if (i==j) map[i][j]=0;
else
map[i][j]=(double) sqrt( (double) (x[i]-x[j])*(x[i]-x[j])+ (y[i]-y[j])*(y[i]-y[j]) );
for (i=1;i<=n;i++)
dis[i]=0x7fffffff;
dis[a]=dis[b]=0;
for (i=1;i<=n;i++)
{
if (map[a][i]<dis[i]) dis[i]=map[a][i];
if (map[b][i]<dis[i]) dis[i]=map[b][i];
}
w=n-2;
memset(hash,0,sizeof(hash));
hash[a]=hash[b]=1;
while (w!=0)
{
w--;
min=0x7fffffff;
for (i=1;i<=n;i++)
if (hash[i]==0 && dis[i]<min)
{
min=dis[i];
k=i;
}
ans+=min;
hash[k]=1;
for (i=1;i<=n;i++)
if (hash[i]==0 && map[k][i]<dis[i])
dis[i]=map[k][i];
}
printf("%.2lf\n",ans);
}
return 0;
}