850. Dijkstra求最短路 II(堆優化模板)

給定一個n個點m條邊的有向圖,圖中可能存在重邊和自環,全部邊權均爲非負值。java

請你求出1號點到n號點的最短距離,若是沒法從1號點走到n號點,則輸出-1。數組

輸入格式

第一行包含整數n和m。ide

接下來m行每行包含三個整數x,y,z,表示存在一條從點x到點y的有向邊,邊長爲z。ui

輸出格式

輸出一個整數,表示1號點到n號點的最短距離。this

若是路徑不存在,則輸出-1。spa

數據範圍

1n,m1051≤n,m≤105,
圖中涉及邊長均不小於0,且不超過10000。
code

輸入樣例:

3 3
1 2 2
2 3 1
1 3 4

輸出樣例:

3

優先隊列找到最近的點

更新時往隊列只加入dis變小的點

代碼:
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Scanner;
class Node implements Comparable<Node>{
        int dis;
        int ind;
        public Node(int ind,int dis){
                this.dis=dis;
                this.ind=ind;
        }
        @Override
        public int compareTo(Node o) {
        // TODO Auto-generated method stub
            return this.dis-o.dis;
        }
}
public class Main{
        static final int N=100005, INF=(int)1e9+5;
        static int h[]=new int[N];
        static int e[]=new int[N];
        static int ne[]=new int[N];
        static int w[]=new int[N];
        static boolean vis[]=new boolean[N];
        static int dis[]=new int[N];
        static int n,m,idx;
        static PriorityQueue<Node> q=new PriorityQueue<Node>();
        static void add(int a,int b,int c){
                e[idx]=b;
                w[idx]=c;
                ne[idx]=h[a];
                h[a]=idx++;
        }
        static int dijkstra(){
                Arrays.fill(dis, INF);
                dis[0]=0;
                q.offer(new Node(1,0));
                while(!q.isEmpty()){
                        Node t=q.poll();
                        if(vis[t.ind])  continue;
                        vis[t.ind]=true;
                        for(int i=h[t.ind];i!=-1;i=ne[i]){
                                int j=e[i];//必定要注意e[]數組表明當前的數字
                                if(dis[j]>t.dis+w[i]){
                                        dis[j]=t.dis+w[i];
                                        q.offer(new Node(j,dis[j]));
                                }
                        }
                }
                if(dis[n]==INF) return -1;
                else return dis[n];
        }
        public static void main(String[] args) {
                Scanner scan=new Scanner(System.in);
                n=scan.nextInt();
                m=scan.nextInt();
                Arrays.fill(h, -1);
                while(m-->0){
                        int a=scan.nextInt();
                        int b=scan.nextInt();
                        int c=scan.nextInt();
                        add(a,b,c);
                }
                System.out.println(dijkstra());
        }
}
相關文章
相關標籤/搜索