|
43 | 43 | * `0 <= wi <= 100`
|
44 | 44 | * 所有 `(ui, vi)` 对都 **互不相同** (即,不含重复边)
|
45 | 45 |
|
46 |
| ---- |
| 46 | +--- |
| 47 | + |
| 48 | +Dijkstra算法 + 堆优化:模板题 |
| 49 | + |
| 50 | +```java |
| 51 | +class Solution { |
| 52 | + public int networkDelayTime(int[][] times, int n, int k) { |
| 53 | + final int INF = Integer.MAX_VALUE / 2; |
| 54 | + int[] dis = new int[n]; |
| 55 | + Arrays.fill(dis, INF); |
| 56 | + int[][] g = new int[n][n]; |
| 57 | + for(int i = 0; i < n; i++){ |
| 58 | + Arrays.fill(g[i], INF); |
| 59 | + } |
| 60 | + for(int[] time: times){ |
| 61 | + g[time[0]- 1][time[1] - 1] = time[2]; |
| 62 | + } |
| 63 | + PriorityQueue<int[]> minHeap = new PriorityQueue<>((a,b) -> (a[0] - b[0])); // [distance, node] |
| 64 | + dis[k - 1] = 0; |
| 65 | + minHeap.add(new int[] {0, k - 1}); |
| 66 | + while(!minHeap.isEmpty()){ |
| 67 | + int[] temp = minHeap.poll(); |
| 68 | + int temp_dis = temp[0], temp_node = temp[1]; |
| 69 | + if(temp_dis > dis[temp_node]) continue; |
| 70 | + for(int i = 0; i < n; i++){ |
| 71 | + if(g[temp_node][i] != INF){ |
| 72 | + if(temp_dis + g[temp_node][i] < dis[i]){ |
| 73 | + minHeap.add(new int[] {temp_dis + g[temp_node][i], i}); |
| 74 | + dis[i] = temp_dis + g[temp_node][i]; |
| 75 | + } |
| 76 | + } |
| 77 | + } |
| 78 | + } |
| 79 | + int ans = 0; |
| 80 | + for(int d: dis){ |
| 81 | + ans = Math.max(ans, d); |
| 82 | + } |
| 83 | + return ans == INF ? -1 : ans; |
| 84 | + } |
| 85 | +} |
| 86 | +``` |
| 87 | + |
0 commit comments