Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 4217576

Browse files
feat: add solutions to lc problem: No.2359 (doocs#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(newint[] {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(newint[] {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+
letmutq=VecDeque::new();
319+
q.push_back(i);
320+
while!q.is_empty() {
321+
i=q.pop_front().unwrap();
322+
for &jin&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 = iasi32;
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)

AltStyle によって変換されたページ (->オリジナル) /