@@ -86,25 +86,25 @@ tags:
86
86
``` python
87
87
class Solution :
88
88
def closestMeetingNode (self , edges : List[int ], node1 : int , node2 : int ) -> int :
89
- def dijkstra (i ):
89
+ def f (i ):
90
90
dist = [inf] * n
91
91
dist[i] = 0
92
- q = [( 0 , i)]
92
+ q = deque([i])
93
93
while q:
94
- i = heappop(q)[ 1 ]
94
+ i = q.popleft()
95
95
for j in g[i]:
96
- if dist[j] > dist[i] + 1 :
96
+ if dist[j] == inf :
97
97
dist[j] = dist[i] + 1
98
- heappush(q, (dist[j], j) )
98
+ q.append(j )
99
99
return dist
100
100
101
101
g = defaultdict(list )
102
102
for i, j in enumerate (edges):
103
103
if j != - 1 :
104
104
g[i].append(j)
105
105
n = len (edges)
106
- d1 = dijkstra (node1)
107
- d2 = dijkstra (node2)
106
+ d1 = f (node1)
107
+ d2 = f (node2)
108
108
ans, d = - 1 , inf
109
109
for i, (a, b) in enumerate (zip (d1, d2)):
110
110
if (t := max (a, b)) < d:
@@ -129,8 +129,8 @@ class Solution {
129
129
g[i]. add(edges[i]);
130
130
}
131
131
}
132
- int [] d1 = dijkstra (node1);
133
- int [] d2 = dijkstra (node2);
132
+ int [] d1 = f (node1);
133
+ int [] d2 = f (node2);
134
134
int d = 1 << 30 ;
135
135
int ans = - 1 ;
136
136
for (int i = 0 ; i < n; ++ i) {
@@ -143,19 +143,18 @@ class Solution {
143
143
return ans;
144
144
}
145
145
146
- private int [] dijkstra (int i ) {
146
+ private int [] f (int i ) {
147
147
int [] dist = new int [n];
148
148
Arrays . fill(dist, 1 << 30 );
149
149
dist[i] = 0 ;
150
- PriorityQueue<int[] > q = new PriorityQueue <> ((a, b) - > a[ 0 ] - b[ 0 ] );
151
- q. offer(new int [] { 0 , i} );
150
+ Deque< Integer > q = new ArrayDeque <> ();
151
+ q. offer(i );
152
152
while (! q. isEmpty()) {
153
- var p = q. poll();
154
- i = p[1 ];
153
+ i = q. poll();
155
154
for (int j : g[i]) {
156
- if (dist[j] > dist[i] + 1 ) {
155
+ if (dist[j] == 1 << 30 ) {
157
156
dist[j] = dist[i] + 1 ;
158
- q. offer(new int [] {dist[j], j} );
157
+ q. offer(j );
159
158
}
160
159
}
161
160
}
@@ -179,26 +178,24 @@ public:
179
178
}
180
179
const int inf = 1 << 30;
181
180
using pii = pair<int, int>;
182
- auto dijkstra = [ &] (int i) {
181
+ auto f = [ &] (int i) {
183
182
vector<int > dist(n, inf);
184
183
dist[ i] = 0;
185
- priority_queue<pii, vector<pii >, greater<pii >> q;
186
- q.emplace(0, i);
184
+ queue<int > q{{i}};
187
185
while (!q.empty()) {
188
- auto p = q.top ();
186
+ i = q.front ();
189
187
q.pop();
190
- i = p.second;
191
188
for (int j : g[ i] ) {
192
- if (dist[ j] > dist [ i ] + 1 ) {
189
+ if (dist[ j] == inf ) {
193
190
dist[ j] = dist[ i] + 1;
194
- q.emplace(dist [ j ] , j);
191
+ q.push( j);
195
192
}
196
193
}
197
194
}
198
195
return dist;
199
196
};
200
- vector<int > d1 = dijkstra (node1);
201
- vector<int > d2 = dijkstra (node2);
197
+ vector<int > d1 = f (node1);
198
+ vector<int > d2 = f (node2);
202
199
int ans = -1, d = inf;
203
200
for (int i = 0; i < n; ++i) {
204
201
int t = max(d1[ i] , d2[ i] );
@@ -224,27 +221,27 @@ func closestMeetingNode(edges []int, node1 int, node2 int) int {
224
221
}
225
222
}
226
223
const inf int = 1 << 30
227
- dijkstra := func(i int) []int {
224
+ f := func(i int) []int {
228
225
dist := make([]int, n)
229
226
for j := range dist {
230
227
dist[j] = inf
231
228
}
232
229
dist[i] = 0
233
- q := hp{}
234
- heap.Push(&q, pair{0, i})
230
+ q := []int{i}
235
231
for len(q) > 0 {
236
- i := heap.Pop(&q).(pair).i
232
+ i = q[0]
233
+ q = q[1:]
237
234
for _, j := range g[i] {
238
- if dist[j] > dist[i]+1 {
235
+ if dist[j] == inf {
239
236
dist[j] = dist[i] + 1
240
- heap.Push(& q, pair{dist[j], j} )
237
+ q = append( q, j )
241
238
}
242
239
}
243
240
}
244
241
return dist
245
242
}
246
- d1 := dijkstra (node1)
247
- d2 := dijkstra (node2)
243
+ d1 := f (node1)
244
+ d2 := f (node2)
248
245
ans, d := -1, inf
249
246
for i, a := range d1 {
250
247
b := d2[i]
@@ -256,15 +253,6 @@ func closestMeetingNode(edges []int, node1 int, node2 int) int {
256
253
}
257
254
return ans
258
255
}
259
-
260
- type pair struct{ d, i int }
261
- type hp []pair
262
-
263
- func (h hp) Len() int { return len(h) }
264
- func (h hp) Less(i, j int) bool { return h[i].d < h[j].d }
265
- func (h hp) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
266
- func (h *hp) Push(v any) { *h = append(*h, v.(pair)) }
267
- func (h *hp) Pop() any { a := *h; v := a[len(a)-1]; *h = a[:len(a)-1]; return v }
268
256
```
269
257
270
258
#### TypeScript
@@ -309,187 +297,50 @@ function closestMeetingNode(edges: number[], node1: number, node2: number): numb
309
297
}
310
298
```
311
299
312
- <!-- tabs: end -->
313
-
314
- <!-- solution: end -->
315
-
316
- <!-- solution: start -->
317
-
318
- ### 方法二
319
-
320
- <!-- tabs: start -->
321
-
322
- #### Python3
323
-
324
- ``` python
325
- class Solution :
326
- def closestMeetingNode (self , edges : List[int ], node1 : int , node2 : int ) -> int :
327
- def f (i ):
328
- dist = [inf] * n
329
- dist[i] = 0
330
- q = deque([i])
331
- while q:
332
- i = q.popleft()
333
- for j in g[i]:
334
- if dist[j] == inf:
335
- dist[j] = dist[i] + 1
336
- q.append(j)
337
- return dist
338
-
339
- g = defaultdict(list )
340
- for i, j in enumerate (edges):
341
- if j != - 1 :
342
- g[i].append(j)
343
- n = len (edges)
344
- d1 = f(node1)
345
- d2 = f(node2)
346
- ans, d = - 1 , inf
347
- for i, (a, b) in enumerate (zip (d1, d2)):
348
- if (t := max (a, b)) < d:
349
- d = t
350
- ans = i
351
- return ans
352
- ```
353
-
354
- #### Java
355
-
356
- ``` java
357
- class Solution {
358
- private int n;
359
- private List<Integer > [] g;
360
-
361
- public int closestMeetingNode (int [] edges , int node1 , int node2 ) {
362
- n = edges. length;
363
- g = new List [n];
364
- Arrays . setAll(g, k - > new ArrayList<> ());
365
- for (int i = 0 ; i < n; ++ i) {
366
- if (edges[i] != - 1 ) {
367
- g[i]. add(edges[i]);
368
- }
369
- }
370
- int [] d1 = f(node1);
371
- int [] d2 = f(node2);
372
- int d = 1 << 30 ;
373
- int ans = - 1 ;
374
- for (int i = 0 ; i < n; ++ i) {
375
- int t = Math . max(d1[i], d2[i]);
376
- if (t < d) {
377
- d = t;
378
- ans = i;
379
- }
380
- }
381
- return ans;
382
- }
383
-
384
- private int [] f (int i ) {
385
- int [] dist = new int [n];
386
- Arrays . fill(dist, 1 << 30 );
387
- dist[i] = 0 ;
388
- Deque<Integer > q = new ArrayDeque<> ();
389
- q. offer(i);
390
- while (! q. isEmpty()) {
391
- i = q. poll();
392
- for (int j : g[i]) {
393
- if (dist[j] == 1 << 30 ) {
394
- dist[j] = dist[i] + 1 ;
395
- q. offer(j);
396
- }
397
- }
398
- }
399
- return dist;
400
- }
401
- }
402
- ```
300
+ #### Rust
403
301
404
- #### C++
302
+ ``` rust
303
+ use std :: collections :: VecDeque ;
405
304
406
- ``` cpp
407
- class Solution {
408
- public:
409
- int closestMeetingNode(vector<int >& edges, int node1, int node2) {
410
- int n = edges.size();
411
- vector<vector<int >> g(n);
412
- for (int i = 0; i < n; ++i) {
413
- if (edges[ i] != -1) {
414
- g[ i] .push_back(edges[ i] );
305
+ impl Solution {
306
+ pub fn closest_meeting_node (edges : Vec <i32 >, node1 : i32 , node2 : i32 ) -> i32 {
307
+ let n = edges . len ();
308
+ let mut g = vec! [Vec :: new (); n ];
309
+ for i in 0 .. n {
310
+ if edges [i ] != - 1 {
311
+ g [i ]. push (edges [i ] as usize );
415
312
}
416
313
}
417
- const int inf = 1 << 30;
418
- using pii = pair<int, int>;
419
- auto f = [ &] (int i) {
420
- vector<int > dist(n, inf);
314
+ let inf = 1 << 30 ;
315
+ let f = | mut i : usize | -> Vec <i32 > {
316
+ let mut dist = vec! [inf ; n ];
421
317
dist [i ] = 0 ;
422
- queue< int > q{{i}} ;
423
- while (!q.empty()) {
424
- i = q.front();
425
- q.pop ();
426
- for (int j : g[ i] ) {
427
- if ( dist[ j] == inf) {
318
+ let mut q = VecDeque :: new () ;
319
+ q . push_back ( i );
320
+ while ! q . is_empty () {
321
+ i = q . pop_front () . unwrap ();
322
+ for & j in & g [i ] {
323
+ if dist [j ] == inf {
428
324
dist [j ] = dist [i ] + 1 ;
429
- q.push (j);
325
+ q . push_back (j );
430
326
}
431
327
}
432
328
}
433
- return dist;
329
+ dist
434
330
};
435
- vector<int > d1 = f(node1);
436
- vector<int > d2 = f(node2);
437
- int ans = -1, d = inf;
438
- for (int i = 0; i < n; ++i) {
439
- int t = max(d1[ i] , d2[ i] );
440
- if (t < d) {
331
+ let d1 = f (node1 as usize );
332
+ let d2 = f (node2 as usize );
333
+ let mut ans = - 1 ;
334
+ let mut d = inf ;
335
+ for i in 0 .. n {
336
+ let t = std :: cmp :: max (d1 [i ], d2 [i ]);
337
+ if t < d {
441
338
d = t ;
442
- ans = i;
339
+ ans = i as i32 ;
443
340
}
444
341
}
445
- return ans;
342
+ ans
446
343
}
447
- };
448
- ```
449
-
450
- #### Go
451
-
452
- ```go
453
- func closestMeetingNode(edges []int, node1 int, node2 int) int {
454
- n := len(edges)
455
- g := make([][]int, n)
456
- for i, j := range edges {
457
- if j != -1 {
458
- g[i] = append(g[i], j)
459
- }
460
- }
461
- const inf int = 1 << 30
462
- f := func(i int) []int {
463
- dist := make([]int, n)
464
- for j := range dist {
465
- dist[j] = inf
466
- }
467
- dist[i] = 0
468
- q := []int{i}
469
- for len(q) > 0 {
470
- i = q[0]
471
- q = q[1:]
472
- for _, j := range g[i] {
473
- if dist[j] == inf {
474
- dist[j] = dist[i] + 1
475
- q = append(q, j)
476
- }
477
- }
478
- }
479
- return dist
480
- }
481
- d1 := f(node1)
482
- d2 := f(node2)
483
- ans, d := -1, inf
484
- for i, a := range d1 {
485
- b := d2[i]
486
- t := max(a, b)
487
- if t < d {
488
- d = t
489
- ans = i
490
- }
491
- }
492
- return ans
493
344
}
494
345
```
495
346
0 commit comments