题意:
本题求所有点连通的最短距离(要求p和q点必须直接相连)。
//http://blog.csdn.net/cyg0810/article/details/8192579
#include<stdio.h>
#include<queue>
#include<math.h>
#include<algorithm>
#include<string>
#include<string.h>
using namespace std;
struct Node {
int x;
int y;
} a[100];
double map[100][100],dis[100],ans;
int n,p,q;
double dist(int i,int j) {
return sqrt(1.0*(a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y));
}
bool Dijkstra() {
bool in[n+10]; // 判断是否已存入该点到S集合中
memset(dis,0x7f7f7f,sizeof(dis));
memset(in,false,sizeof(in));
in[p] = true;
dis[p]=0;
for(int i=1;i<=n;i++){
dis[i]=map[p][i];
}
int cnt=2;
while(cnt<n){
double tmp=0x7f7f7f;
int si=p;
for(int i=1;i<=n;i++){
if(in[i]==false&&dis[i]<tmp){
tmp=dis[i];
si=i;
}
}
if(tmp==0x7f7f7f) return false;
in[si]=true;
ans+=tmp;
for(int i=1;i<=n;i++){
if(in[i]==false&&dis[i]> map[si][i]){
dis[i]=map[si][i];
}
}
cnt++;
}
return true;
}
int main() {
while(~scanf("%d",&n),n) {
ans=0;
scanf("%d %d",&p,&q);
for(int i=1; i<=n; i++) {
scanf("%d %d",&a[i].x,&a[i].y);
}
for(int i=1; i<=n; i++) {
for(int j=i; j<=n; j++) {
map[i][j]=dist(i,j);
map[j][i]=dist(i,j);
}
}
//map[p][q]=map[q][p]=0;
if(Dijkstra()==false) continue;
ans+=dist(p,q);
printf("%.2lf\n",ans);
}
}