这是一道最小生成树模板题
#include<iostream>
#include<cstring>
#include<vector>
#include<cmath>
using namespace std;
const int INF=400;
int n,p1,p2;
double tempDist,ans;
struct node{
int x;
int y;
}points[51];
double dist[51][51];
double minDist[51];
bool used[51];
void getDist()
{
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(dist[i][j])continue;
double temp1=points[i].x-points[j].x;
double temp2=points[i].y-points[j].y;
tempDist=sqrt(temp1*temp1+temp2*temp2);
dist[i][j]=tempDist;
dist[j][i]=tempDist;
}
}
}
int main(void)
{
while(scanf("%d",&n))
{
if(!n)break;
scanf("%d%d",&p1,&p2);
p1--;
p2--;
for(int i=0;i<n;i++)
{
used[i]=false;
minDist[i]=INF;
scanf("%d%d",&points[i].x,&points[i].y);
}
memset(dist,0,sizeof(dist));
getDist();
ans=0;
minDist[p1]=0;
used[p1]=true;
ans+=minDist[p1];
for(int i=0;i<n;i++)
{
minDist[i]=min(minDist[i],dist[p1][i]);
}
used[p2]=true;
ans+=minDist[p2];
for(int i=0;i<n;i++)
{
minDist[i]=min(minDist[i],dist[p2][i]);
}
while(true)
{
int v=-1;
for(int i=0;i<n;i++){
if(!used[i]&&(v==-1||minDist[i]<minDist[v]))v=i;
}
if(v==-1)break;
used[v]=true;
ans+=minDist[v];
for(int i=0;i<n;i++)
{
minDist[i]=min(minDist[i],dist[v][i]);
}
}
printf("%.2f\n",ans);
}
return 0;
}