Skip to content

Commit 991e138

Browse files
committed
feat: add solutions to lc problem: No.0743
No.0743.Network Delay Time
1 parent ae8cb2d commit 991e138

File tree

4 files changed

+340
-2
lines changed

4 files changed

+340
-2
lines changed

solution/0700-0799/0743.Network Delay Time/README.md

Lines changed: 171 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,18 +55,24 @@
5555

5656
<!-- 这里可写通用的实现逻辑 -->
5757

58+
设 n 表示点数,m 表示边数。
59+
5860
**方法一:朴素 Dijkstra 算法**
5961

60-
时间复杂度 O(n²)。
62+
时间复杂度 O(n²+m)。
6163

6264
**方法二:堆优化 Dijkstra 算法**
6365

64-
时间复杂度 O(nlogm)。
66+
时间复杂度 O(mlogn)。
6567

6668
**方法三:Bellman Ford 算法**
6769

6870
时间复杂度 O(nm)。
6971

72+
**方法四:SPFA 算法**
73+
74+
时间复杂度,平均情况下 O(m),最坏情况下 O(nm),n 表示点数,m 表示边数。
75+
7076
<!-- tabs:start -->
7177

7278
### **Python3**
@@ -136,6 +142,32 @@ class Solution:
136142
return -1 if ans == INF else ans
137143
```
138144

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+
139171
### **Java**
140172

141173
<!-- 这里可写当前语言的特殊实现逻辑 -->
@@ -246,6 +278,50 @@ class Solution {
246278
}
247279
```
248280

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+
249325
### **Go**
250326

251327
```go
@@ -414,6 +490,56 @@ func min(a, b int) int {
414490
}
415491
```
416492

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+
417543
### **C++**
418544

419545
```cpp
@@ -473,6 +599,49 @@ public:
473599
};
474600
```
475601
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+
476645
### **...**
477646

478647
```

0 commit comments

Comments
 (0)