放在草稿箱很久了,现在才发现他
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
struct ooo
{
int to,next;
}l[105];
int h[105],a[105],b[105],st[305];
int n,m,x,y,s,t,head,tail;
double f[105][105],c[105];
bool fy[105];
int main()
{
memset(f,0x7f,sizeof(f));
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]);
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
l[++s].to=y; l[s].next=h[x]; h[x]=s;
l[++s].to=x; l[s].next=h[y]; h[y]=s; //邻接表
f[x][y]=f[y][x]=sqrt((a[x]-a[y])*(a[x]-a[y])
+(b[x]-b[y])*(b[x]-b[y]));
}
scanf("%d%d",&s,&t);
head=0; tail=1;
st[1]=s; fy[s]=1;
do
{
head++;
int tt=st[head];
for(int i=h[tt];i;i=l[i].next)
if(c[tt]+f[tt][l[i].to]<c[l[i].to]) //如果可以更新此点
{
c[l[i].to]=c[tt]+f[tt][l[i].to];
if(!fy[l[i].to]) //如果此点不在队列里面
{
fy[l[i].to]=1; st[++tail]=l[i].to; //加入队列
}
}
fy[tt]=0; //把tt退出队列
}while(head<tail);
printf("%.2lf",c[t]);
return 0;
}