Skip to content

Commit 4217576

Browse files
authored
feat: add solutions to lc problem: No.2359 (#4423)
No.2359.Find Closest Node to Given Two Nodes
1 parent 9eb9ca9 commit 4217576

File tree

11 files changed

+202
-616
lines changed

11 files changed

+202
-616
lines changed

solution/2300-2399/2359.Find Closest Node to Given Two Nodes/README.md

Lines changed: 60 additions & 209 deletions
Original file line numberDiff line numberDiff line change
@@ -86,25 +86,25 @@ tags:
8686
```python
8787
class 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

Comments
 (0)