做法是Dijkstra两个数组记录
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e4+20;
const int M=1e5+20;
const int inf=1145141919;
inline int read(){
int f=1,k=0;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-'){
f=-1;
}
c=getchar();
}
while(c>='0'&&c<='9'){
k=(k<<3)+(k<<1)+(c^48);
c=getchar();
}
return f*k;
}
int cnt;
int head[N];
struct mouse_king{
int v,next;
double w;
}edge[2*M];
inline void add(int u,int v,double w){
edge[++cnt].v=v;
edge[cnt].next=head[u];
edge[cnt].w=w;
head[u]=cnt;
return;
}
int n,m;
double dis1[N];
double dis2[N];
int vis[N];
inline void dijkstra(int s){
for(int i=1;i<=n;i++){
dis1[i]=dis2[i]=inf;
}
priority_queue<pair<int,int> ,vector<pair<int,int> >,greater<pair<int,int> > > q;
q.push(make_pair(0,s));
dis1[s]=0;
while(!q.empty()){
int u=q.top().second;
q.pop();
if(vis[u]) continue;
vis[u]=1;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].v;
double w=edge[i].w;
if(dis1[v]>dis1[u]+w){
dis2[v]=dis1[v];
dis1[v]=dis1[u]+w;
if(!vis[v])
q.push(make_pair(dis1[v],v));
}else if(dis2[v]>dis1[u]+w){
dis2[v]=dis1[u]+w;
if(!vis[v])
q.push(make_pair(dis1[v],v));
}
if(dis2[v]>dis2[u]+w){
dis2[v]=dis2[u]+w;
}
}
}
return ;
}
struct big_mouse{
int x,y;
}node[N];
inline double solve(int a,int b){
double x1=node[a].x;
double y1=node[a].y;
double x2=node[b].x;
double y2=node[b].y;
double w=sqrt(pow(abs(x1-x2),2)+pow(abs(y1-y2),2));
return w;
}
signed main(){
n=read(),m=read();
for(int i=1;i<=n;i++){
node[i].x=read(),node[i].y=read();
}
for(int i=1;i<=m;i++){
int u,v;
u=read(),v=read();
double w=solve(u,v);
add(u,v,w);
add(v,u,w);
}
dijkstra(1);
if(dis2[n]==inf){
cout<<-1;
return 0;
}
printf("%0.2lf",dis2[n]);
return 0;
}