最短路dijstrela,堆优化,这就是个模版题,无向图,计算从点1到点n的最短路,我用了优先队列优化。
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=1005;
static final int maxm=5005;
static class edge{
int v,next,w;
edge(int next,int v,int 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 int dist[]=new int[maxn];
static final int max=0x3f3f3f3f;
static void init(){
eid=0;
Arrays.fill(p, -1);
}
static void insert(int u,int v,int w){
e[eid]=new edge(p[u],v,w);
p[u]=eid++;
}
static void add(int u,int v,int w){
insert(u,v,w);
insert(v,u,w);
}
static class point implements Comparable<point>{
int u;
int dist;
point(int u,int dist){
this.u=u;
this.dist=dist;
}
@Override
public int compareTo(point p) {
if(this.dist-p.dist!=0)
return this.dist-p.dist;
else
return 0;
}
}
static void dijkstra(int u){
Arrays.fill(vst, false);
Arrays.fill(dist, 0x3f3f3f3f);
PriorityQueue<point> min_heap=new PriorityQueue<point>();
dist[u]=0;
min_heap.add(new point(u,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){
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]));
}
}
}
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
m=sc.nextInt();
init();
int a,b,c;
for(int i=0;i<m;i++){
a=sc.nextInt();
b=sc.nextInt();
c=sc.nextInt();
add(a,b,c);
}
dijkstra(1);
System.out.println(dist[n]);
sc.close();
}
}