【编程题目 | 200分】最小传输时延 [ 200 / 中等 ]
注:

起点到终点得最小时延,不可达则返回-1
3 3
1 2 11
2 3 13
1 3 50
1 3
24
典型的有向图的单源最短路径,可以使用Dijkstra算法计算起点到终点的最短时延。
使用优先队列实现算法中每次取最短路径。
提供两种连接关系的表示方法,包括邻接表和邻接矩阵。
注:邻接矩阵表示的时候,不要赋值Integer.MAX_VALUE,会溢出,+1,变为负数
可以参考:【Leetcode】图算法总结
邻接表
import java.util.*;
public class minLatency {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int M = in.nextInt();
int[][] times = new int[M][3];
for (int i = 0; i < M; i++) {
times[i][0] = in.nextInt();
times[i][1] = in.nextInt();
times[i][2] = in.nextInt();
}
int start = in.nextInt();
int end = in.nextInt();
// Dijkstra算法,邻接表
PriorityQueue<int[]> queue = new PriorityQueue<>((a, b) -> a[1] - b[1]);
int[] dist = new int[N + 1];
Arrays.fill(dist, Integer.MAX_VALUE);
dist[start] = 0;
queue.add(new int[]{start, 0});
while (!queue.isEmpty()) {
int[] poll = queue.poll();
int node = poll[0];
for (int i = 0; i < times.length; i++) {
if (times[i][0] == node) {
int next = times[i][1];
if (dist[next] > dist[node] + times[i][2]) {
dist[next] = dist[node] + times[i][2];
queue.add(new int[]{next, dist[next]});
}
}
}
}
if (dist[end] == Integer.MAX_VALUE) {
System.out.println(-1);
} else {
System.out.println(dist[end]);
}
}
}
邻接矩阵
import java.util.*;
public class minLatency {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int M = in.nextInt();
int[][] times = new int[M][3];
for (int i = 0; i < M; i++) {
times[i][0] = in.nextInt();
times[i][1] = in.nextInt();
times[i][2] = in.nextInt();
}
int start = in.nextInt();
int end = in.nextInt();
// Dijkstra算法,邻接矩阵
int maxValue = 6001; // 不能用Integer.MAX_VALUE,最大值会出现溢出
int[][] graph = new int[N + 1][N + 1]; // 邻接矩阵
for(int i = 1; i <= N; i++){
for(int j = 1; j <= N; j++){
graph[i][j] = (i == j ? 0 : maxValue);
}
}
for(int i = 0; i < times.length; i++){
int v = times[i][0];
int w = times[i][1];
int weight = times[i][2];
graph[v][w] = weight;
}
int[] dist = new int[N + 1];
PriorityQueue<Integer> queue = new PriorityQueue<>();
Arrays.fill(dist, maxValue);
dist[start] = 0;
queue.add(start);
while(!queue.isEmpty()){
int node = queue.poll();
for(int next = 1; next <= N; next++){
if(dist[node] + graph[node][next] < dist[next]){
dist[next] = dist[node] + graph[node][next];
queue.add(next);
}
}
}
if (dist[end] == maxValue) {
System.out.println(-1);
} else {
System.out.println(dist[end]);
}
}
}
欢迎在评论区指正以及留下自己的更简洁的方法。