1
- const Inf = 0x3f3f3f3f
2
-
3
- type pair struct {
4
- first int
5
- second int
6
- }
7
-
8
- var _ heap.Interface = (* pairs )(nil )
9
-
10
- type pairs []pair
11
-
12
- func (a pairs ) Len () int { return len (a ) }
13
- func (a pairs ) Less (i int , j int ) bool {
14
- return a [i ].first < a [j ].first || a [i ].first == a [j ].first && a [i ].second < a [j ].second
15
- }
16
- func (a pairs ) Swap (i int , j int ) { a [i ], a [j ] = a [j ], a [i ] }
17
- func (a * pairs ) Push (x any ) { * a = append (* a , x .(pair )) }
18
- func (a * pairs ) Pop () any { l := len (* a ); t := (* a )[l - 1 ]; * a = (* a )[:l - 1 ]; return t }
19
-
20
1
func networkDelayTime (times [][]int , n int , k int ) int {
21
- graph := make ([]pairs , n )
22
- for _ , time := range times {
23
- from , to , time := time [0 ]- 1 , time [1 ]- 1 , time [2 ]
24
- graph [ from ] = append (graph [ from ], pair { to , time })
2
+ g := make ([][][ 2 ] int , n )
3
+ for _ , e := range times {
4
+ u , v , w := e [0 ]- 1 , e [1 ]- 1 , e [2 ]
5
+ g [ u ] = append (g [ u ], [ 2 ] int { v , w })
25
6
}
26
-
27
- dis := make ([] int , n )
28
- for i := range dis {
29
- dis [i ] = Inf
7
+ dist := make ([] int , n )
8
+ const inf int = 1 << 29
9
+ for i := range dist {
10
+ dist [i ] = inf
30
11
}
31
- dis [k - 1 ] = 0
32
-
33
- vis := make ([]bool , n )
34
- h := make (pairs , 0 )
35
- heap .Push (& h , pair {0 , k - 1 })
36
- for len (h ) > 0 {
37
- from := heap .Pop (& h ).(pair ).second
38
- if vis [from ] {
12
+ dist [k - 1 ] = 0
13
+ pq := hp {{0 , k - 1 }}
14
+ for len (pq ) > 0 {
15
+ p := heap .Pop (& pq ).(pair )
16
+ d , u := p .x , p .i
17
+ if d > dist [u ] {
39
18
continue
40
19
}
41
- vis [from ] = true
42
- for _ , e := range graph [from ] {
43
- to , d := e .first , dis [from ]+ e .second
44
- if d < dis [to ] {
45
- dis [to ] = d
46
- heap .Push (& h , pair {d , to })
20
+ for _ , e := range g [u ] {
21
+ v , w := e [0 ], e [1 ]
22
+ if nd := d + w ; nd < dist [v ] {
23
+ dist [v ] = nd
24
+ heap .Push (& pq , pair {nd , v })
47
25
}
48
26
}
49
27
}
50
- ans := slices .Max (dis )
51
- if ans == Inf {
52
- return - 1
28
+ if ans := slices .Max (dist ); ans < inf {
29
+ return ans
53
30
}
54
- return ans
55
- }
31
+ return - 1
32
+
33
+ }
34
+
35
+ type pair struct { x , i int }
36
+ type hp []pair
37
+
38
+ func (h hp ) Len () int { return len (h ) }
39
+ func (h hp ) Less (i , j int ) bool { return h [i ].x < h [j ].x }
40
+ func (h hp ) Swap (i , j int ) { h [i ], h [j ] = h [j ], h [i ] }
41
+ func (h * hp ) Push (x any ) { * h = append (* h , x .(pair )) }
42
+ func (h * hp ) Pop () (x any ) { a := * h ; x = a [len (a )- 1 ]; * h = a [:len (a )- 1 ]; return }
0 commit comments