```cpp
#include<iostream>
#include<iomanip>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int n,m;
struct uct1{
int x;
int y;
}p[205];
struct uct2{
int to;
int next;
double v;
}l[100005];
int read(){
int ans=0,fh;
char c;
c=getchar();
if(c=='-')fh=-1;
while('0'<=c&c<='9'){
ans*=10;
ans+=c-'0';
c=getchar();
}
return ans*fh;
}
int cnt,h[205];
int square(int x){
return x*x;
}
void add(int f,int t){
double len=sqrt(square(double(p[f].x-p[t].x))+square(double(p[f].y-p[t].y)));
cnt++;
l[cnt].to=t;
l[cnt].next=h[f];
l[cnt].v=len;
h[f]=cnt;
cnt++;
l[cnt].to=f;
l[cnt].next=h[t];
l[cnt].v=len;
h[t]=cnt;
}
double vis[205],d2[205],d1[205];
queue<int>q;
void spfa(int x,double d[]){
q.push(x);
vis[205]=1;
for(int i=1;i<=n;i++){
d[i]=0xfffffff;
}
d[x]=0;
double len;
int top,to;
while(!q.empty()){
top=q.front();
q.pop();
vis[top]=0;
for(int i=h[top];i!=0;i=l[i].next){
to=l[i].to;len=l[i].v;
if(d[to]>d[top]+len){
d[to]=d[top]+len;
if(vis[to]==0){
q.push(to);
vis[to]=1;
}
}
}
}
}
int a,b;
int main(){
cin>>n>>m;
// n=read();
// m=read();
for(int i=1;i<=n;i++){
// p[i].x=read();
// p[i].y=read();
cin>>p[i].x>>p[i].y;
}
for(int i=1;i<=m;i++){
// a=read();
// b=read();
cin>>a>>b;
add(a,b);
}
spfa(1,d1);
spfa(n,d2);
double minn=0xfffffff,ll=d1[n];
for(int i=1;i<=n;i++){
if(d1[i]+d2[i]<minn&&d1[i]+d2[i]>ll){
minn=d1[i]+d2[i];
}
}
// for(int i=1;i<=n;i++){
// cout<<d1[i]<<" ";
// }
// cout<<endl;
// for(int i=1;i<=n;i++){
// cout<<d2[i]<<" ";
// }
// cout<<endl;
// cout<<minn<<endl;
// for(int i=1;i<=n;i++){
// cout<<l[i].v<<" ";
// }
// cout<<endl;
if(minn==0xfffffff)cout<<-1;
else cout<<fixed<<setprecision(2)<<minn;
return 0;
}
```
同上
by p9t6g @ 2018-07-10 14:25:11