AcWing850-Dijkstra求最短路 II
题目描述
给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为非负值。
请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 −1。
输入格式
第一行包含整数 n 和 m。
接下来 m 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。
输出格式
输出一个整数,表示 1 号点到 n 号点的最短距离。
如果路径不存在,则输出 −1。
数据范围
1≤n,m≤1.5×10^5
图中涉及边长均不小于 00,且不超过 10000。
输入样例:
3 3
1 2 2
2 3 1
1 3 4
输出样例:
3
题解一
package acWing850;
import java.util.*;
import java.io.*;
class Pair implements Comparable<Pair>{
int x,y;
public Pair(int x,int y) {
this.x = x; // 节点
this.y = y; // 距离
}
@Override
public int compareTo(Pair o) {
return o.y - this.y;
}
}
public class Main {
static int N = 150010;
static int n, m;
static int h[] = new int [N],w[] = new int [N],e[] = new int [N],ne[] = new int [N],idx;
static int [] dist = new int [N] ;
static boolean [] st = new boolean [N];
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 (){
PriorityQueue<Pair> pq = new PriorityQueue<>() ;
int INF = 1 << 30 ;
Arrays.fill(dist,INF);
pq.add(new Pair(1, 0)) ;
dist[1] = 0 ;
while (!pq.isEmpty()) {
Pair cur = pq.poll();
int ver = cur.x ;
int distance = cur.y ;
if (st[ver]) continue ;
st[ver] = 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];
pq.add(new Pair(j, dist[j]));
}
}
}
return dist[n] == INF ? -1 : dist[n];
}
public static void main (String [] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String [] str = br.readLine().split(" ");
n = Integer.parseInt(str[0]);m = Integer.parseInt(str[1]);
Arrays.fill(h, -1) ;
while (m--> 0) {
str = br.readLine().split(" ");
int a = Integer.parseInt(str[0]);
int b = Integer.parseInt(str[1]);
int c = Integer.parseInt(str[2]);
add(a, b, c);
}
System.out.println(dijkstra());
br.close();
}
}
题解二
private static int dijkstra (){
PriorityQueue<int[]> pq = new PriorityQueue<>(n, (a, b) -> {return a[1] - b[1];}) ;
int INF = 1 << 30 ;
Arrays.fill(dist,INF);
pq.offer(new int []{1, 0}) ;
dist[1] = 0 ;
while (!pq.isEmpty()) {
int [] cur = pq.poll();
int ver = cur[0] ;
int distance = cur[1] ;
if (st[ver]) continue ;
st[ver] = 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];
pq.offer(new int [] {j, dist[j]});
}
}
}
return dist[n] == INF ? -1 : dist[n];
}
}