最短路径问题,与一般题的区别是,有两个点必须用一条直线直接连接,
此时就把这两点的距离算出来,并建立关系,pre【k】=h;
其他的用最短路径就很好解决了,
注意的是建立两个数组,防止发生覆盖;
#include"stdio.h"
#include"algorithm"
#include"math.h"
using namespace std;
int pre[20000];
struct point
{
int x,y;
double z;
}a[200000],b[20000];
int find(int k)
{
if(k!=pre[k])
pre[k]=find(pre[k]);
return pre[k];
}
int cmp(point a,point b)
{
return a.z<b.z;
}
int main()
{
int m,i,j,k,h,t,aa,bb;;
double s;
while(scanf("%d",&m)!=EOF,m!=0)
{
for(i=0;i<m;i++)
pre[i]=i;
scanf("%d%d",&k,&h);
k--;
h--;
pre[k]=h;
t=0;s=0;
for(i=0;i<m;i++)
scanf("%d%d",&b[i].x,&b[i].y);
s=sqrt((1.0*(b[k].x-b[h].x)*(b[k].x-b[h].x)+(b[k].y-b[h].y)*(b[k].y-b[h].y)));
for(i=0;i<m;i++)
for(j=i+1;j<m;j++)
{
a[t].z=sqrt(1.0*((b[i].x-b[j].x)*(b[i].x-b[j].x)+(b[i].y-b[j].y)*(b[i].y-b[j].y)));
a[t].x=i;
a[t].y=j;
t++;
}
sort(a,a+t,cmp);
for(i=0;i<t;i++)
{
aa=find(a[i].x);
bb=find(a[i].y);
if(aa!=bb)
{
pre[aa]=bb;
s+=a[i].z;
}
}
printf("%.2f\n",s);
}
return 0;
}