题目大意:求两个点之间的次短路,做法就是先求一遍最短路,记录路径,然后枚举最短路上的边,依次跳过这条边,求此时图中的最短路。
AC代码:
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Scanner;
/*
* 最短路dijstrela,堆优化
*/
public class Main {
static int n,m,eid;
static final int maxn=205;
static final int maxm=50005;
static class edge{
int v,next;
double w;
edge(int next,int v,double w){
this.next=next;
this.v=v;
this.w=w;
}
}
static edge[] e=new edge[maxm<<1];
static int p[]=new int[maxn];
static boolean vst[]=new boolean[maxn];
static double dist[]=new double[maxn];
static double max=99999999;
static int fa[]=new int[maxn];
static void init(){
eid=0;
Arrays.fill(p, -1);
}
static void insert(int u,int v,double w){
e[eid]=new edge(p[u],v,w);
p[u]=eid++;
}
static void add(int u,int v,double w){
insert(u,v,w);
insert(v,u,w);
}
static class point implements Comparable<point>{
int u;
double dist;
point(int u,double dist){
this.u=u;
this.dist=dist;
}
@Override
public int compareTo(point p) {
if(this.dist>p.dist)
return 1;
else if(this.dist<p.dist)
return -1;
else
return 0;
}
}
static void dijkstra(int a,int b){
Arrays.fill(vst, false);
Arrays.fill(dist, 99999999);
PriorityQueue<point> min_heap=new PriorityQueue<point>();
dist[1]=0;
min_heap.add(new point(1,0));
while(!min_heap.isEmpty()){
int v=min_heap.poll().u;
if(vst[v]){
continue;
}
vst[v]=true;
for(int i=p[v];i!=-1;i=e[i].next){
if(v==a&&e[i].v==b||v==b&&e[i].v==a)//跳过最短路上的某条边
continue;
int x=e[i].v;
if(!vst[x]&&dist[x]>dist[v]+e[i].w){
dist[x]=dist[v]+e[i].w;
min_heap.add(new point(x,dist[x]));
if(a==0&&b==0)
fa[x]=v;
}
}
}
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
m=sc.nextInt();
init();
int x[]=new int[n+1];
int y[]=new int[n+1];
for(int i=1;i<=n;i++){
x[i]=sc.nextInt();
y[i]=sc.nextInt();
}
int a,b;
double d=0;
for(int i=0;i<m;i++){
a=sc.nextInt();
b=sc.nextInt();
d=Math.sqrt((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]));
add(a,b,d);
}
dijkstra(0,0);
int now=n;
while(fa[now]!=0){
dijkstra(fa[now],now);
max=Math.min(dist[n], max);
now=fa[now];
}
if(99999999==max)
System.out.print("-1");
else
System.out.printf("%.2f",dist[n]);
System.out.println();
sc.close();
}
}