@@ -47,3 +47,104 @@ const networkDelayTime = function(times, N, K) {
47
47
const res = Math . max ( ...distances ) ;
48
48
return res === Infinity ? - 1 : res ;
49
49
} ;
50
+
51
+ // another
52
+
53
+ /**
54
+ * @param {number[][] } times
55
+ * @param {number } N
56
+ * @param {number } K
57
+ * @return {number }
58
+ */
59
+ const networkDelayTime = function ( times , N , K ) {
60
+ const hash = { }
61
+ for ( const [ u , v , t ] of times ) {
62
+ if ( hash [ u ] == null ) hash [ u ] = { }
63
+ hash [ u ] [ v ] = t
64
+ }
65
+ const pq = new PriorityQueue ( ( a , b ) => a [ 0 ] < b [ 0 ] )
66
+ pq . push ( [ 0 , K ] )
67
+ const visited = Array . from ( N + 1 )
68
+ let res = 0
69
+ while ( ! pq . isEmpty ( ) ) {
70
+ const [ dist , cur ] = pq . pop ( )
71
+ if ( visited [ cur ] ) continue
72
+ visited [ cur ] = true
73
+ res = dist
74
+ N --
75
+ if ( hash [ cur ] ) {
76
+ for ( let next of Object . keys ( hash [ cur ] ) ) {
77
+ pq . push ( [ dist + hash [ cur ] [ next ] , next ] )
78
+ }
79
+ }
80
+ }
81
+ return N === 0 ? res : - 1
82
+ }
83
+
84
+ class PriorityQueue {
85
+ constructor ( comparator = ( a , b ) => a > b ) {
86
+ this . heap = [ ]
87
+ this . top = 0
88
+ this . comparator = comparator
89
+ }
90
+ size ( ) {
91
+ return this . heap . length
92
+ }
93
+ isEmpty ( ) {
94
+ return this . size ( ) === 0
95
+ }
96
+ peek ( ) {
97
+ return this . heap [ this . top ]
98
+ }
99
+ push ( ...values ) {
100
+ values . forEach ( ( value ) => {
101
+ this . heap . push ( value )
102
+ this . siftUp ( )
103
+ } )
104
+ return this . size ( )
105
+ }
106
+ pop ( ) {
107
+ const poppedValue = this . peek ( )
108
+ const bottom = this . size ( ) - 1
109
+ if ( bottom > this . top ) {
110
+ this . swap ( this . top , bottom )
111
+ }
112
+ this . heap . pop ( )
113
+ this . siftDown ( )
114
+ return poppedValue
115
+ }
116
+ replace ( value ) {
117
+ const replacedValue = this . peek ( )
118
+ this . heap [ this . top ] = value
119
+ this . siftDown ( )
120
+ return replacedValue
121
+ }
122
+
123
+ parent = ( i ) => ( ( i + 1 ) >>> 1 ) - 1
124
+ left = ( i ) => ( i << 1 ) + 1
125
+ right = ( i ) => ( i + 1 ) << 1
126
+ greater = ( i , j ) => this . comparator ( this . heap [ i ] , this . heap [ j ] )
127
+ swap = ( i , j ) => ( [ this . heap [ i ] , this . heap [ j ] ] = [ this . heap [ j ] , this . heap [ i ] ] )
128
+ siftUp = ( ) => {
129
+ let node = this . size ( ) - 1
130
+ while ( node > this . top && this . greater ( node , this . parent ( node ) ) ) {
131
+ this . swap ( node , this . parent ( node ) )
132
+ node = this . parent ( node )
133
+ }
134
+ }
135
+ siftDown = ( ) => {
136
+ let node = this . top
137
+ while (
138
+ ( this . left ( node ) < this . size ( ) && this . greater ( this . left ( node ) , node ) ) ||
139
+ ( this . right ( node ) < this . size ( ) && this . greater ( this . right ( node ) , node ) )
140
+ ) {
141
+ let maxChild =
142
+ this . right ( node ) < this . size ( ) &&
143
+ this . greater ( this . right ( node ) , this . left ( node ) )
144
+ ? this . right ( node )
145
+ : this . left ( node )
146
+ this . swap ( node , maxChild )
147
+ node = maxChild
148
+ }
149
+ }
150
+ }
0 commit comments