@@ -86,25 +86,25 @@ tags:
8686``` python
8787class Solution :
8888 def closestMeetingNode (self , edges : List[int ], node1 : int , node2 : int ) -> int :
89- def dijkstra (i ):
89+ def f (i ):
9090 dist = [inf] * n
9191 dist[i] = 0
92- q = [( 0 , i)]
92+ q = deque([i])
9393 while q:
94- i = heappop(q)[ 1 ]
94+ i = q.popleft()
9595 for j in g[i]:
96- if dist[j] > dist[i] + 1 :
96+ if dist[j] == inf :
9797 dist[j] = dist[i] + 1
98- heappush(q, (dist[j], j) )
98+ q.append(j )
9999 return dist
100100
101101 g = defaultdict(list )
102102 for i, j in enumerate (edges):
103103 if j != - 1 :
104104 g[i].append(j)
105105 n = len (edges)
106- d1 = dijkstra (node1)
107- d2 = dijkstra (node2)
106+ d1 = f (node1)
107+ d2 = f (node2)
108108 ans, d = - 1 , inf
109109 for i, (a, b) in enumerate (zip (d1, d2)):
110110 if (t := max (a, b)) < d:
@@ -129,8 +129,8 @@ class Solution {
129129 g[i]. add(edges[i]);
130130 }
131131 }
132- int [] d1 = dijkstra (node1);
133- int [] d2 = dijkstra (node2);
132+ int [] d1 = f (node1);
133+ int [] d2 = f (node2);
134134 int d = 1 << 30 ;
135135 int ans = - 1 ;
136136 for (int i = 0 ; i < n; ++ i) {
@@ -143,19 +143,18 @@ class Solution {
143143 return ans;
144144 }
145145
146- private int [] dijkstra (int i ) {
146+ private int [] f (int i ) {
147147 int [] dist = new int [n];
148148 Arrays . fill(dist, 1 << 30 );
149149 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 );
152152 while (! q. isEmpty()) {
153- var p = q. poll();
154- i = p[1 ];
153+ i = q. poll();
155154 for (int j : g[i]) {
156- if (dist[j] > dist[i] + 1 ) {
155+ if (dist[j] == 1 << 30 ) {
157156 dist[j] = dist[i] + 1 ;
158- q. offer(new int [] {dist[j], j} );
157+ q. offer(j );
159158 }
160159 }
161160 }
@@ -179,26 +178,24 @@ public:
179178 }
180179 const int inf = 1 << 30;
181180 using pii = pair<int, int>;
182- auto dijkstra = [ &] (int i) {
181+ auto f = [ &] (int i) {
183182 vector<int > dist(n, inf);
184183 dist[ i] = 0;
185- priority_queue<pii, vector<pii >, greater<pii >> q;
186- q.emplace(0, i);
184+ queue<int > q{{i}};
187185 while (!q.empty()) {
188- auto p = q.top ();
186+ i = q.front ();
189187 q.pop();
190- i = p.second;
191188 for (int j : g[ i] ) {
192- if (dist[ j] > dist [ i ] + 1 ) {
189+ if (dist[ j] == inf ) {
193190 dist[ j] = dist[ i] + 1;
194- q.emplace(dist [ j ] , j);
191+ q.push( j);
195192 }
196193 }
197194 }
198195 return dist;
199196 };
200- vector<int > d1 = dijkstra (node1);
201- vector<int > d2 = dijkstra (node2);
197+ vector<int > d1 = f (node1);
198+ vector<int > d2 = f (node2);
202199 int ans = -1, d = inf;
203200 for (int i = 0; i < n; ++i) {
204201 int t = max(d1[ i] , d2[ i] );
@@ -224,27 +221,27 @@ func closestMeetingNode(edges []int, node1 int, node2 int) int {
224221 }
225222 }
226223 const inf int = 1 << 30
227- dijkstra := func(i int) []int {
224+ f := func(i int) []int {
228225 dist := make([]int, n)
229226 for j := range dist {
230227 dist[j] = inf
231228 }
232229 dist[i] = 0
233- q := hp{}
234- heap.Push(&q, pair{0, i})
230+ q := []int{i}
235231 for len(q) > 0 {
236- i := heap.Pop(&q).(pair).i
232+ i = q[0]
233+ q = q[1:]
237234 for _, j := range g[i] {
238- if dist[j] > dist[i]+1 {
235+ if dist[j] == inf {
239236 dist[j] = dist[i] + 1
240- heap.Push(& q, pair{dist[j], j} )
237+ q = append( q, j )
241238 }
242239 }
243240 }
244241 return dist
245242 }
246- d1 := dijkstra (node1)
247- d2 := dijkstra (node2)
243+ d1 := f (node1)
244+ d2 := f (node2)
248245 ans, d := -1, inf
249246 for i, a := range d1 {
250247 b := d2[i]
@@ -256,15 +253,6 @@ func closestMeetingNode(edges []int, node1 int, node2 int) int {
256253 }
257254 return ans
258255}
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 }
268256```
269257
270258#### TypeScript
@@ -309,187 +297,50 @@ function closestMeetingNode(edges: number[], node1: number, node2: number): numb
309297}
310298```
311299
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
403301
404- #### C++
302+ ``` rust
303+ use std :: collections :: VecDeque ;
405304
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 );
415312 }
416313 }
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 ];
421317 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 {
428324 dist [j ] = dist [i ] + 1 ;
429- q.push (j);
325+ q . push_back (j );
430326 }
431327 }
432328 }
433- return dist;
329+ dist
434330 };
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 {
441338 d = t ;
442- ans = i;
339+ ans = i as i32 ;
443340 }
444341 }
445- return ans;
342+ ans
446343 }
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
493344}
494345```
495346
0 commit comments