|
55 | 55 |
|
56 | 56 | <!-- 这里可写通用的实现逻辑 -->
|
57 | 57 |
|
| 58 | +设 n 表示点数,m 表示边数。 |
| 59 | + |
58 | 60 | **方法一:朴素 Dijkstra 算法**
|
59 | 61 |
|
60 |
| -时间复杂度 O(n²)。 |
| 62 | +时间复杂度 O(n²+m)。 |
61 | 63 |
|
62 | 64 | **方法二:堆优化 Dijkstra 算法**
|
63 | 65 |
|
64 |
| -时间复杂度 O(nlogm)。 |
| 66 | +时间复杂度 O(mlogn)。 |
65 | 67 |
|
66 | 68 | **方法三:Bellman Ford 算法**
|
67 | 69 |
|
68 | 70 | 时间复杂度 O(nm)。
|
69 | 71 |
|
| 72 | +**方法四:SPFA 算法** |
| 73 | + |
| 74 | +时间复杂度,平均情况下 O(m),最坏情况下 O(nm),n 表示点数,m 表示边数。 |
| 75 | + |
70 | 76 | <!-- tabs:start -->
|
71 | 77 |
|
72 | 78 | ### **Python3**
|
@@ -136,6 +142,32 @@ class Solution:
|
136 | 142 | return -1 if ans == INF else ans
|
137 | 143 | ```
|
138 | 144 |
|
| 145 | +```python |
| 146 | +class Solution: |
| 147 | + def networkDelayTime(self, times: List[List[int]], n: int, k: int) -> int: |
| 148 | + INF = 0x3f3f |
| 149 | + dist = [INF] * n |
| 150 | + vis = [False] * n |
| 151 | + g = defaultdict(list) |
| 152 | + for u, v, w in times: |
| 153 | + g[u - 1].append((v - 1, w)) |
| 154 | + k -= 1 |
| 155 | + dist[k] = 0 |
| 156 | + q = deque([k]) |
| 157 | + vis[k] = True |
| 158 | + while q: |
| 159 | + u = q.popleft() |
| 160 | + vis[u] = False |
| 161 | + for v, w in g[u]: |
| 162 | + if dist[v] > dist[u] + w: |
| 163 | + dist[v] = dist[u] + w |
| 164 | + if not vis[v]: |
| 165 | + q.append(v) |
| 166 | + vis[v] = True |
| 167 | + ans = max(dist) |
| 168 | + return -1 if ans == INF else ans |
| 169 | +``` |
| 170 | + |
139 | 171 | ### **Java**
|
140 | 172 |
|
141 | 173 | <!-- 这里可写当前语言的特殊实现逻辑 -->
|
@@ -246,6 +278,50 @@ class Solution {
|
246 | 278 | }
|
247 | 279 | ```
|
248 | 280 |
|
| 281 | +```java |
| 282 | +class Solution { |
| 283 | + private static final int INF = 0x3f3f; |
| 284 | + |
| 285 | + public int networkDelayTime(int[][] times, int n, int k) { |
| 286 | + int[] dist = new int[n]; |
| 287 | + boolean[] vis = new boolean[n]; |
| 288 | + List<int[]>[] g = new List[n]; |
| 289 | + for (int i = 0; i < n; ++i) { |
| 290 | + dist[i] = INF; |
| 291 | + g[i] = new ArrayList<>(); |
| 292 | + } |
| 293 | + for (int[] t : times) { |
| 294 | + int u = t[0] - 1, v = t[1] - 1, w = t[2]; |
| 295 | + g[u].add(new int[]{v, w}); |
| 296 | + } |
| 297 | + --k; |
| 298 | + dist[k] = 0; |
| 299 | + Deque<Integer> q = new ArrayDeque<>(); |
| 300 | + q.offer(k); |
| 301 | + vis[k] = true; |
| 302 | + while (!q.isEmpty()) { |
| 303 | + int u = q.poll(); |
| 304 | + vis[u] = false; |
| 305 | + for (int[] ne : g[u]) { |
| 306 | + int v = ne[0], w = ne[1]; |
| 307 | + if (dist[v] > dist[u] + w) { |
| 308 | + dist[v] = dist[u] + w; |
| 309 | + if (!vis[v]) { |
| 310 | + q.offer(v); |
| 311 | + vis[v] = true; |
| 312 | + } |
| 313 | + } |
| 314 | + } |
| 315 | + } |
| 316 | + int ans = 0; |
| 317 | + for (int i = 0; i < n; ++i) { |
| 318 | + ans = Math.max(ans, dist[i]); |
| 319 | + } |
| 320 | + return ans == INF ? -1 : ans; |
| 321 | + } |
| 322 | +} |
| 323 | +``` |
| 324 | + |
249 | 325 | ### **Go**
|
250 | 326 |
|
251 | 327 | ```go
|
@@ -414,6 +490,56 @@ func min(a, b int) int {
|
414 | 490 | }
|
415 | 491 | ```
|
416 | 492 |
|
| 493 | +```go |
| 494 | +func networkDelayTime(times [][]int, n int, k int) int { |
| 495 | + const inf = 0x3f3f |
| 496 | + dist := make([]int, n) |
| 497 | + vis := make([]bool, n) |
| 498 | + g := make([][][]int, n) |
| 499 | + for i := range dist { |
| 500 | + dist[i] = inf |
| 501 | + } |
| 502 | + for _, t := range times { |
| 503 | + u, v, w := t[0]-1, t[1]-1, t[2] |
| 504 | + g[u] = append(g[u], []int{v, w}) |
| 505 | + } |
| 506 | + k-- |
| 507 | + dist[k] = 0 |
| 508 | + q := []int{k} |
| 509 | + vis[k] = true |
| 510 | + for len(q) > 0 { |
| 511 | + u := q[0] |
| 512 | + q = q[1:] |
| 513 | + vis[u] = false |
| 514 | + for _, ne := range g[u] { |
| 515 | + v, w := ne[0], ne[1] |
| 516 | + if dist[v] > dist[u]+w { |
| 517 | + dist[v] = dist[u] + w |
| 518 | + if !vis[v] { |
| 519 | + q = append(q, v) |
| 520 | + vis[v] = true |
| 521 | + } |
| 522 | + } |
| 523 | + } |
| 524 | + } |
| 525 | + ans := 0 |
| 526 | + for _, v := range dist { |
| 527 | + ans = max(ans, v) |
| 528 | + } |
| 529 | + if ans == inf { |
| 530 | + return -1 |
| 531 | + } |
| 532 | + return ans |
| 533 | +} |
| 534 | + |
| 535 | +func max(a, b int) int { |
| 536 | + if a > b { |
| 537 | + return a |
| 538 | + } |
| 539 | + return b |
| 540 | +} |
| 541 | +``` |
| 542 | + |
417 | 543 | ### **C++**
|
418 | 544 |
|
419 | 545 | ```cpp
|
@@ -473,6 +599,49 @@ public:
|
473 | 599 | };
|
474 | 600 | ```
|
475 | 601 |
|
| 602 | +```cpp |
| 603 | +class Solution { |
| 604 | +public: |
| 605 | + const int inf = 0x3f3f; |
| 606 | +
|
| 607 | + int networkDelayTime(vector<vector<int>>& times, int n, int k) { |
| 608 | + vector<int> dist(n, inf); |
| 609 | + vector<vector<vector<int>>> g(n); |
| 610 | + for (auto& e : times) |
| 611 | + { |
| 612 | + int u = e[0] - 1, v = e[1] - 1, w = e[2]; |
| 613 | + g[u].push_back({v, w}); |
| 614 | + } |
| 615 | + vector<bool> vis(n); |
| 616 | + --k; |
| 617 | + queue<int> q{{k}}; |
| 618 | + vis[k] = true; |
| 619 | + dist[k] = 0; |
| 620 | + while (!q.empty()) |
| 621 | + { |
| 622 | + int u = q.front(); |
| 623 | + q.pop(); |
| 624 | + vis[u] = false; |
| 625 | + for (auto& ne : g[u]) |
| 626 | + { |
| 627 | + int v = ne[0], w = ne[1]; |
| 628 | + if (dist[v] > dist[u] + w) |
| 629 | + { |
| 630 | + dist[v] = dist[u] + w; |
| 631 | + if (!vis[v]) |
| 632 | + { |
| 633 | + q.push(v); |
| 634 | + vis[v] = true; |
| 635 | + } |
| 636 | + } |
| 637 | + } |
| 638 | + } |
| 639 | + int ans = *max_element(dist.begin(), dist.end()); |
| 640 | + return ans == inf ? -1 : ans; |
| 641 | + } |
| 642 | +}; |
| 643 | +``` |
| 644 | + |
476 | 645 | ### **...**
|
477 | 646 |
|
478 | 647 | ```
|
|
0 commit comments