import java.io.*;

import java.util.Arrays;

import java.util.Comparator;

import java.util.PriorityQueue;

public class Main {

static final int N = 150010;

static int n, m; //结点数,边数

static int[] h, e, ne, w; //邻接表适合表示稀疏图,w用来存每个边权重

static int idx;

static int[] dist;

static boolean[] status = new boolean[N]; //是否已确定最短路,最好直接赋值,这样默认是false

static final int DIST = 0x3f3f3f3f; //>10^9,大于所有距离之和,可用来表示正无穷

//升序比较器

static Comparator> cmp = new Comparator>() {

public int compare(Pairss p1, Pairss p2) {

return (int)p1.getKey() - (int)p2.getKey();

}

};

//默认最小堆,由于内容是Pairss,因此需要比较器。

//用堆来存储结点的距离和编号,被更新过距离的边会被加入堆,表示可到达

static PriorityQueue> heap = new PriorityQueue<>(cmp);

public static void main(String[] args) throws IOException {

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

BufferedWriter log = new BufferedWriter(new OutputStreamWriter(System.out));

String[] s = reader.readLine().split(" ");

n = Integer.parseInt(s[0]);

m = Integer.parseInt(s[1]);

h = new int[n+1];

e = new int[m];

ne = new int[m];

w = new int[m];

dist = new int[n+1];

Arrays.fill(h, -1);

Arrays.fill(dist, 1,n+1,DIST);

//不需要对重边和自环做特殊处理,因为算法保证了最短路

while (m-- != 0) {

s = reader.readLine().split(" ");

int a = Integer.parseInt(s[0]);

int b = Integer.parseInt(s[1]);

int c = Integer.parseInt(s[2]);

add(a,b,c);

}

int t = dijkstra();

log.write(t + "");

log.flush();

log.close();

reader.close();

}

private static void add(int a, int b, int c) {

e[idx] = b;

w[idx] = c;

ne[idx] = h[a];

h[a] = idx++;

}

private static int dijkstra() {

dist[1] = 0;

heap.add(new Pairss<>(0,1)); //1号点,距离为0

while(!heap.isEmpty()) {

Pairss t = heap.remove();

int ver = t.getValue(); int distance = t.getKey();

if(ver == n) break; //结点n已经确定最短路,结束程序

if(status[ver]) continue; //该值是个冗余备份,pop出的这个结点已经确定最短路径,因此可以continue了

status[ver] = true; //将这个被选中的结点状态设置为true,表示加入已确定最短路径的点的集合

for (int i = h[ver]; i != -1; i = ne[i]) { //更新该结点的出边指向的点的距离

int j = e[i];

if(dist[j] > distance + w[i]) {

dist[j] = distance + w[i];

heap.add(new Pairss<>(dist[j],j));

}

}

}

if(dist[n] == 0x3f3f3f3f) return -1;

return dist[n];

}

}

class Pairss {

private T1 key;

private T2 value;

public Pairss(T1 t1,T2 t2) {

key = t1;

value = t2;

}

public T1 getKey() {

return key;

}

public T2 getValue() {

return value;

}

}

两点间最短路 java_AcWing 850. Dijkstra求最短路 II_Java实现含详细注释相关推荐

  1. AcWing 850. Dijkstra求最短路 II

    原题链接:AcWing 850. Dijkstra求最短路 II 给定一个 n 个点 m 条边的有向图,图中可能存在 重边 和 自环 ,所有边权均为 非负值 . 请你求出 1 号点到 n 号点的最短距 ...

  2. AcWing 850. Dijkstra求最短路 II【最短路】【堆优化版Dijkstra】

    AcWing 850. Dijkstra求最短路 II 一.题目链接 二.题目分析 (一)算法标签 (二)解题思路 三.AC代码 四.其它题解 一.题目链接 AcWing 850. Dijkstra求 ...

  3. 堆优化版dijkstra算法:AcWing 850. Dijkstra求最短路 II

    堆优化版dijkstra算法分析: 朴素版dijkstra的时间复杂度为O(n^2),主要瓶颈在于第1步的寻找全局最小值的过程. 可以用小根堆(C++STL priority_queue)对dist数 ...

  4. Dijkstra AcWing 850. Dijkstra求最短路 II

    Dijkstra AcWing 850. Dijkstra求最短路 II 原题链接 AcWing 850. Dijkstra求最短路 II 算法标签 最短路 Dijkstra 思路 图片摘自该题解 图 ...

  5. acwing 850. Dijkstra求最短路(二)堆优化版本

    给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为非负值. 请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 −1. 输入格式 第一行包含整 ...

  6. 【ACWing】850. Dijkstra求最短路 II

    题目地址: https://www.acwing.com/problem/content/description/852/ 给定一个nnn个点mmm条边的有向图,图中可能存在重边和自环,所有边权均为非 ...

  7. AcWing 850. Dijkstra求最短路 II(堆优化dijkstra)

    题目链接 : 点击查看 题目描述 : 给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为非负值. 请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点, ...

  8. 850. Dijkstra求最短路 II

    堆优化的步骤 1.用一个优先队列来存储编号和距离 2.对求出已知点中的最短距离来更新每一个点 3.判断是否有解 代码 #include <cstring> #include <ios ...

  9. AcWing 850. Dijkstra求最短路 II(最短路)

    堆优化dijkstra: #include<bits/stdc++.h> using namespace std;const int N=200010; typedef pair<i ...

最新文章

  1. web 容器 Jetty 简介
  2. rsync的原理和安装使用及配制详解(三)(转)
  3. Flask爱家租房--城区信息
  4. 记一次小程序自定义导航栏及加载动画的解决方案
  5. 韦诺之战wesnoth没有声音
  6. linux Shell学习笔记第二天
  7. C盘搬家,不需要任何第三方工具
  8. 华硕主板破linux密码破解,华硕P8B75-M-LE老主板加持NVMe SSD bios(刷新软件和bios)...
  9. rvm、Ruby安装(亲测有效)
  10. HIT软件构造 软件生命周期 配置管理
  11. 离线语音控制命令识别,全向麦、会议蓝牙音箱方案
  12. 自己整理的机器学习算法应用指南
  13. 联想G40-70固态安装教程(实际操作经验)
  14. 小学作文批改评语大全
  15. 罗彻斯特大学计算机科学系专业排名,罗切斯特大学排名计算机工程,得用心去看...
  16. 英特尔Skylake处理器全面入驻Google Compute Engine
  17. 【flutter】按钮,添加圆角
  18. php html wxml,微信开发之WXML、WXSS 和JS的详细介绍
  19. 经典算法——韩信点兵问题的简单算法
  20. Flutter必备——Dart入门(下)

热门文章

  1. c语言程序设计算机基础知识,2018春C语言程序设计(合肥工业大学)
  2. java+timer+退出,java timer 兑现在指定时间执行方法
  3. Springboot源码——应用程序上下文分析
  4. (一)uboot的移植与制作
  5. Ubuntu更换gnome桌面环境后不能root登录
  6. C语言实现音乐播放器(Linux madplay)
  7. python的多行语句可以使用反斜杠_python 为什么不用分号作终止符?
  8. python数独游戏源代码100行_python实现自动解数独小程序
  9. mysql运行状态监控研究内容_如何监控mysql主从的运行状态shell脚本实例介绍
  10. 计算机发展史评课议课稿,评课议课记录范文