zoukankan      html  css  js  c++  java
  • 850. Dijkstra求最短路 II(堆优化模板)

    给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为非负值。

    请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1。

    输入格式

    第一行包含整数n和m。

    接下来m行每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。

    输出格式

    输出一个整数,表示1号点到n号点的最短距离。

    如果路径不存在,则输出-1。

    数据范围

    1n,m1051≤n,m≤105,
    图中涉及边长均不小于0,且不超过10000。

    输入样例:

    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());
            }
    }
  • 相关阅读:
    API接口安全设计方案(已实现)
    第8篇-dispatch_next()函数分派字节码
    第7篇-为Java方法创建栈帧
    第6篇-Java方法新栈帧的创建
    第5篇-调用Java方法后弹出栈帧及处理返回结果
    第4篇-JVM终于开始调用Java主类的main()方法啦
    第3篇-CallStub新栈帧的创建
    第2篇-JVM虚拟机这样来调用Java主类的main()方法
    第1篇-关于JVM运行时,开篇说的简单些
    SpringCloud和SpringCloudAlibaba超详细总结
  • 原文地址:https://www.cnblogs.com/qdu-lkc/p/12255478.html
Copyright © 2011-2022 走看看