【Floyd】朴实无华的三重循环
class Solution {
public int networkDelayTime(int[][] times, int n, int k) {
int[][] f = new int[n][n];
for(var i = 0; i < n; i++){
for(var j = 0; j < n; j++){
f[i][j] = -1;
}
}
for(var t: times) f[t[0] - 1][t[1] - 1] = t[2];
for(var l = 0; l < n; l++){
for(var i = 0; i < n; i++){
for(var j = 0; j < n; j++){
if(f[i][l] != -1 && f[l][j] != -1 && (f[i][l] + f[l][j] < f[i][j] || f[i][j] == -1)){
// System.out.println(f[i][l] + " " + f[l][j]);
f[i][j] = f[i][l] + f[l][j];
}
}
}
}
int ans = 0;
k--;
// for(var i = 0; i < n; i++){
// for(var j = 0; j < n; j++){
// System.out.print(f[i][j] + " ");
// }
// System.out.println();
// }
for(var i = 0; i < n; i++){
if(i == k) continue;
if(f[k][i] == -1) return -1;
ans = Math.max(ans, f[k][i]);
}
return ans;
}
}
【Dijkstra】
class Solution {
public int networkDelayTime(int[][] times, int n, int k) {
PriorityQueue<int[]> queue = new PriorityQueue<int[]>((a, b) -> { return a[0] - b[0]; });
List<List<int[]>> list = new ArrayList();
for(var i = 0; i < n; i++) list.add(new ArrayList());
for(var t: times){
list.get(t[0] - 1).add(new int[] {t[1] - 1, t[2]});
}
k--;
queue.offer(new int[] {0, k});
int[] dis = new int[n];
int inf = 1 << 30;
Arrays.fill(dis, inf);
dis[k] = 0;
while(!queue.isEmpty()){
var top = queue.poll();
int x = top[1];
for(var v: list.get(x)){
int y = v[0];
int d = v[1];
if(d + dis[x] < dis[y]){
dis[y] = d + dis[x];
// System.out.println(dis[y]);
queue.offer(new int[] {dis[y], y});
}
}
}
int ans = 0;
// for(var i: dis) System.out.println(i);
for(var i: dis){
if(i >= inf) return -1;
ans = Math.max(ans, i);
}
return ans;
}
}