两点间最短路 java_AcWing 850. Dijkstra求最短路 II_Java实现含详细注释
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实现含详细注释相关推荐
- AcWing 850. Dijkstra求最短路 II
原题链接:AcWing 850. Dijkstra求最短路 II 给定一个 n 个点 m 条边的有向图,图中可能存在 重边 和 自环 ,所有边权均为 非负值 . 请你求出 1 号点到 n 号点的最短距 ...
- AcWing 850. Dijkstra求最短路 II【最短路】【堆优化版Dijkstra】
AcWing 850. Dijkstra求最短路 II 一.题目链接 二.题目分析 (一)算法标签 (二)解题思路 三.AC代码 四.其它题解 一.题目链接 AcWing 850. Dijkstra求 ...
- 堆优化版dijkstra算法:AcWing 850. Dijkstra求最短路 II
堆优化版dijkstra算法分析: 朴素版dijkstra的时间复杂度为O(n^2),主要瓶颈在于第1步的寻找全局最小值的过程. 可以用小根堆(C++STL priority_queue)对dist数 ...
- Dijkstra AcWing 850. Dijkstra求最短路 II
Dijkstra AcWing 850. Dijkstra求最短路 II 原题链接 AcWing 850. Dijkstra求最短路 II 算法标签 最短路 Dijkstra 思路 图片摘自该题解 图 ...
- acwing 850. Dijkstra求最短路(二)堆优化版本
给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为非负值. 请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 −1. 输入格式 第一行包含整 ...
- 【ACWing】850. Dijkstra求最短路 II
题目地址: https://www.acwing.com/problem/content/description/852/ 给定一个nnn个点mmm条边的有向图,图中可能存在重边和自环,所有边权均为非 ...
- AcWing 850. Dijkstra求最短路 II(堆优化dijkstra)
题目链接 : 点击查看 题目描述 : 给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为非负值. 请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点, ...
- 850. Dijkstra求最短路 II
堆优化的步骤 1.用一个优先队列来存储编号和距离 2.对求出已知点中的最短距离来更新每一个点 3.判断是否有解 代码 #include <cstring> #include <ios ...
- AcWing 850. Dijkstra求最短路 II(最短路)
堆优化dijkstra: #include<bits/stdc++.h> using namespace std;const int N=200010; typedef pair<i ...
最新文章
- web 容器 Jetty 简介
- rsync的原理和安装使用及配制详解(三)(转)
- Flask爱家租房--城区信息
- 记一次小程序自定义导航栏及加载动画的解决方案
- 韦诺之战wesnoth没有声音
- linux Shell学习笔记第二天
- C盘搬家,不需要任何第三方工具
- 华硕主板破linux密码破解,华硕P8B75-M-LE老主板加持NVMe SSD bios(刷新软件和bios)...
- rvm、Ruby安装(亲测有效)
- HIT软件构造 软件生命周期 配置管理
- 离线语音控制命令识别,全向麦、会议蓝牙音箱方案
- 自己整理的机器学习算法应用指南
- 联想G40-70固态安装教程(实际操作经验)
- 小学作文批改评语大全
- 罗彻斯特大学计算机科学系专业排名,罗切斯特大学排名计算机工程,得用心去看...
- 英特尔Skylake处理器全面入驻Google Compute Engine
- 【flutter】按钮,添加圆角
- php html wxml,微信开发之WXML、WXSS 和JS的详细介绍
- 经典算法——韩信点兵问题的简单算法
- Flutter必备——Dart入门(下)
热门文章
- c语言程序设计算机基础知识,2018春C语言程序设计(合肥工业大学)
- java+timer+退出,java timer 兑现在指定时间执行方法
- Springboot源码——应用程序上下文分析
- (一)uboot的移植与制作
- Ubuntu更换gnome桌面环境后不能root登录
- C语言实现音乐播放器(Linux madplay)
- python的多行语句可以使用反斜杠_python 为什么不用分号作终止符?
- python数独游戏源代码100行_python实现自动解数独小程序
- mysql运行状态监控研究内容_如何监控mysql主从的运行状态shell脚本实例介绍
- 计算机发展史评课议课稿,评课议课记录范文