diff --git a/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/README.md b/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/README.md index 4be648359d10b..1eff5b11f7d36 100644 --- a/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/README.md +++ b/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/README.md @@ -86,16 +86,16 @@ tags: ```python class Solution: def closestMeetingNode(self, edges: List[int], node1: int, node2: int) -> int: - def dijkstra(i): + def f(i): dist = [inf] * n dist[i] = 0 - q = [(0, i)] + q = deque([i]) while q: - i = heappop(q)[1] + i = q.popleft() for j in g[i]: - if dist[j] > dist[i] + 1: + if dist[j] == inf: dist[j] = dist[i] + 1 - heappush(q, (dist[j], j)) + q.append(j) return dist g = defaultdict(list) @@ -103,8 +103,8 @@ class Solution: if j != -1: g[i].append(j) n = len(edges) - d1 = dijkstra(node1) - d2 = dijkstra(node2) + d1 = f(node1) + d2 = f(node2) ans, d = -1, inf for i, (a, b) in enumerate(zip(d1, d2)): if (t := max(a, b)) < d: @@ -129,8 +129,8 @@ class Solution { g[i].add(edges[i]); } } - int[] d1 = dijkstra(node1); - int[] d2 = dijkstra(node2); + int[] d1 = f(node1); + int[] d2 = f(node2); int d = 1 << 30; int ans = -1; for (int i = 0; i < n; ++i) { @@ -143,19 +143,18 @@ class Solution { return ans; } - private int[] dijkstra(int i) { + private int[] f(int i) { int[] dist = new int[n]; Arrays.fill(dist, 1 << 30); dist[i] = 0; - PriorityQueue q = new PriorityQueue<>((a, b) -> a[0] - b[0]); - q.offer(new int[] {0, i}); + Deque q = new ArrayDeque<>(); + q.offer(i); while (!q.isEmpty()) { - var p = q.poll(); - i = p[1]; + i = q.poll(); for (int j : g[i]) { - if (dist[j] > dist[i] + 1) { + if (dist[j] == 1 << 30) { dist[j] = dist[i] + 1; - q.offer(new int[] {dist[j], j}); + q.offer(j); } } } @@ -179,26 +178,24 @@ public: } const int inf = 1 << 30; using pii = pair; - auto dijkstra = [&](int i) { + auto f = [&](int i) { vector dist(n, inf); dist[i] = 0; - priority_queue, greater> q; - q.emplace(0, i); + queue q{{i}}; while (!q.empty()) { - auto p = q.top(); + i = q.front(); q.pop(); - i = p.second; for (int j : g[i]) { - if (dist[j] > dist[i] + 1) { + if (dist[j] == inf) { dist[j] = dist[i] + 1; - q.emplace(dist[j], j); + q.push(j); } } } return dist; }; - vector d1 = dijkstra(node1); - vector d2 = dijkstra(node2); + vector d1 = f(node1); + vector d2 = f(node2); int ans = -1, d = inf; for (int i = 0; i < n; ++i) { int t = max(d1[i], d2[i]); @@ -224,27 +221,27 @@ func closestMeetingNode(edges []int, node1 int, node2 int) int { } } const inf int = 1 << 30 - dijkstra := func(i int) []int { + f := func(i int) []int { dist := make([]int, n) for j := range dist { dist[j] = inf } dist[i] = 0 - q := hp{} - heap.Push(&q, pair{0, i}) + q := []int{i} for len(q) > 0 { - i := heap.Pop(&q).(pair).i + i = q[0] + q = q[1:] for _, j := range g[i] { - if dist[j] > dist[i]+1 { + if dist[j] == inf { dist[j] = dist[i] + 1 - heap.Push(&q, pair{dist[j], j}) + q = append(q, j) } } } return dist } - d1 := dijkstra(node1) - d2 := dijkstra(node2) + d1 := f(node1) + d2 := f(node2) ans, d := -1, inf for i, a := range d1 { b := d2[i] @@ -256,15 +253,6 @@ func closestMeetingNode(edges []int, node1 int, node2 int) int { } return ans } - -type pair struct{ d, i int } -type hp []pair - -func (h hp) Len() int { return len(h) } -func (h hp) Less(i, j int) bool { return h[i].d < h[j].d } -func (h hp) Swap(i, j int) { h[i], h[j] = h[j], h[i] } -func (h *hp) Push(v any) { *h = append(*h, v.(pair)) } -func (h *hp) Pop() any { a := *h; v := a[len(a)-1]; *h = a[:len(a)-1]; return v } ``` #### TypeScript @@ -309,187 +297,50 @@ function closestMeetingNode(edges: number[], node1: number, node2: number): numb } ``` - - - - - - -### 方法二 - - - -#### Python3 - -```python -class Solution: - def closestMeetingNode(self, edges: List[int], node1: int, node2: int) -> int: - def f(i): - dist = [inf] * n - dist[i] = 0 - q = deque([i]) - while q: - i = q.popleft() - for j in g[i]: - if dist[j] == inf: - dist[j] = dist[i] + 1 - q.append(j) - return dist - - g = defaultdict(list) - for i, j in enumerate(edges): - if j != -1: - g[i].append(j) - n = len(edges) - d1 = f(node1) - d2 = f(node2) - ans, d = -1, inf - for i, (a, b) in enumerate(zip(d1, d2)): - if (t := max(a, b)) < d: - d = t - ans = i - return ans -``` - -#### Java - -```java -class Solution { - private int n; - private List[] g; - - public int closestMeetingNode(int[] edges, int node1, int node2) { - n = edges.length; - g = new List[n]; - Arrays.setAll(g, k -> new ArrayList<>()); - for (int i = 0; i < n; ++i) { - if (edges[i] != -1) { - g[i].add(edges[i]); - } - } - int[] d1 = f(node1); - int[] d2 = f(node2); - int d = 1 << 30; - int ans = -1; - for (int i = 0; i < n; ++i) { - int t = Math.max(d1[i], d2[i]); - if (t < d) { - d = t; - ans = i; - } - } - return ans; - } - - private int[] f(int i) { - int[] dist = new int[n]; - Arrays.fill(dist, 1 << 30); - dist[i] = 0; - Deque q = new ArrayDeque<>(); - q.offer(i); - while (!q.isEmpty()) { - i = q.poll(); - for (int j : g[i]) { - if (dist[j] == 1 << 30) { - dist[j] = dist[i] + 1; - q.offer(j); - } - } - } - return dist; - } -} -``` +#### Rust -#### C++ +```rust +use std::collections::VecDeque; -```cpp -class Solution { -public: - int closestMeetingNode(vector& edges, int node1, int node2) { - int n = edges.size(); - vector> g(n); - for (int i = 0; i < n; ++i) { - if (edges[i] != -1) { - g[i].push_back(edges[i]); +impl Solution { + pub fn closest_meeting_node(edges: Vec, node1: i32, node2: i32) -> i32 { + let n = edges.len(); + let mut g = vec![Vec::new(); n]; + for i in 0..n { + if edges[i] != -1 { + g[i].push(edges[i] as usize); } } - const int inf = 1 << 30; - using pii = pair; - auto f = [&](int i) { - vector dist(n, inf); + let inf = 1 << 30; + let f = |mut i: usize| -> Vec { + let mut dist = vec![inf; n]; dist[i] = 0; - queue q{{i}}; - while (!q.empty()) { - i = q.front(); - q.pop(); - for (int j : g[i]) { - if (dist[j] == inf) { + let mut q = VecDeque::new(); + q.push_back(i); + while !q.is_empty() { + i = q.pop_front().unwrap(); + for &j in &g[i] { + if dist[j] == inf { dist[j] = dist[i] + 1; - q.push(j); + q.push_back(j); } } } - return dist; + dist }; - vector d1 = f(node1); - vector d2 = f(node2); - int ans = -1, d = inf; - for (int i = 0; i < n; ++i) { - int t = max(d1[i], d2[i]); - if (t < d) { + let d1 = f(node1 as usize); + let d2 = f(node2 as usize); + let mut ans = -1; + let mut d = inf; + for i in 0..n { + let t = std::cmp::max(d1[i], d2[i]); + if t < d { d = t; - ans = i; + ans = i as i32; } } - return ans; + ans } -}; -``` - -#### Go - -```go -func closestMeetingNode(edges []int, node1 int, node2 int) int { - n := len(edges) - g := make([][]int, n) - for i, j := range edges { - if j != -1 { - g[i] = append(g[i], j) - } - } - const inf int = 1 << 30 - f := func(i int) []int { - dist := make([]int, n) - for j := range dist { - dist[j] = inf - } - dist[i] = 0 - q := []int{i} - for len(q) > 0 { - i = q[0] - q = q[1:] - for _, j := range g[i] { - if dist[j] == inf { - dist[j] = dist[i] + 1 - q = append(q, j) - } - } - } - return dist - } - d1 := f(node1) - d2 := f(node2) - ans, d := -1, inf - for i, a := range d1 { - b := d2[i] - t := max(a, b) - if t < d { - d = t - ans = i - } - } - return ans } ``` diff --git a/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/README_EN.md b/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/README_EN.md index 12a7148f5a56e..d11063ebbcdea 100644 --- a/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/README_EN.md +++ b/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/README_EN.md @@ -65,7 +65,15 @@ The maximum of those two distances is 2. It can be proven that we cannot get a n -### Solution 1 +### Solution 1: BFS + Enumerate Common Nodes + +We can first use BFS to calculate the distance from $node1$ and $node2$ to every node, denoted as $d_1$ and $d_2$ respectively. Then, enumerate all common nodes $i$, and for each, compute $\max(d_1[i], d_2[i])$. The answer is the node with the minimal such value. + +The complexity is $O(n)$, and the space complexity is $O(n)$, where $n$ is the number of nodes. + +Related problems: + +- [2203. Minimum Weighted Subgraph With the Required Paths](https://github.com/doocs/leetcode/blob/main/solution/2200-2299/2203.Minimum%20Weighted%20Subgraph%20With%20the%20Required%20Paths/README_EN.md) @@ -74,16 +82,16 @@ The maximum of those two distances is 2. It can be proven that we cannot get a n ```python class Solution: def closestMeetingNode(self, edges: List[int], node1: int, node2: int) -> int: - def dijkstra(i): + def f(i): dist = [inf] * n dist[i] = 0 - q = [(0, i)] + q = deque([i]) while q: - i = heappop(q)[1] + i = q.popleft() for j in g[i]: - if dist[j] > dist[i] + 1: + if dist[j] == inf: dist[j] = dist[i] + 1 - heappush(q, (dist[j], j)) + q.append(j) return dist g = defaultdict(list) @@ -91,8 +99,8 @@ class Solution: if j != -1: g[i].append(j) n = len(edges) - d1 = dijkstra(node1) - d2 = dijkstra(node2) + d1 = f(node1) + d2 = f(node2) ans, d = -1, inf for i, (a, b) in enumerate(zip(d1, d2)): if (t := max(a, b)) < d: @@ -117,8 +125,8 @@ class Solution { g[i].add(edges[i]); } } - int[] d1 = dijkstra(node1); - int[] d2 = dijkstra(node2); + int[] d1 = f(node1); + int[] d2 = f(node2); int d = 1 << 30; int ans = -1; for (int i = 0; i < n; ++i) { @@ -131,19 +139,18 @@ class Solution { return ans; } - private int[] dijkstra(int i) { + private int[] f(int i) { int[] dist = new int[n]; Arrays.fill(dist, 1 << 30); dist[i] = 0; - PriorityQueue q = new PriorityQueue<>((a, b) -> a[0] - b[0]); - q.offer(new int[] {0, i}); + Deque q = new ArrayDeque<>(); + q.offer(i); while (!q.isEmpty()) { - var p = q.poll(); - i = p[1]; + i = q.poll(); for (int j : g[i]) { - if (dist[j] > dist[i] + 1) { + if (dist[j] == 1 << 30) { dist[j] = dist[i] + 1; - q.offer(new int[] {dist[j], j}); + q.offer(j); } } } @@ -167,26 +174,24 @@ public: } const int inf = 1 << 30; using pii = pair; - auto dijkstra = [&](int i) { + auto f = [&](int i) { vector dist(n, inf); dist[i] = 0; - priority_queue, greater> q; - q.emplace(0, i); + queue q{{i}}; while (!q.empty()) { - auto p = q.top(); + i = q.front(); q.pop(); - i = p.second; for (int j : g[i]) { - if (dist[j] > dist[i] + 1) { + if (dist[j] == inf) { dist[j] = dist[i] + 1; - q.emplace(dist[j], j); + q.push(j); } } } return dist; }; - vector d1 = dijkstra(node1); - vector d2 = dijkstra(node2); + vector d1 = f(node1); + vector d2 = f(node2); int ans = -1, d = inf; for (int i = 0; i < n; ++i) { int t = max(d1[i], d2[i]); @@ -212,27 +217,27 @@ func closestMeetingNode(edges []int, node1 int, node2 int) int { } } const inf int = 1 << 30 - dijkstra := func(i int) []int { + f := func(i int) []int { dist := make([]int, n) for j := range dist { dist[j] = inf } dist[i] = 0 - q := hp{} - heap.Push(&q, pair{0, i}) + q := []int{i} for len(q) > 0 { - i := heap.Pop(&q).(pair).i + i = q[0] + q = q[1:] for _, j := range g[i] { - if dist[j] > dist[i]+1 { + if dist[j] == inf { dist[j] = dist[i] + 1 - heap.Push(&q, pair{dist[j], j}) + q = append(q, j) } } } return dist } - d1 := dijkstra(node1) - d2 := dijkstra(node2) + d1 := f(node1) + d2 := f(node2) ans, d := -1, inf for i, a := range d1 { b := d2[i] @@ -244,15 +249,6 @@ func closestMeetingNode(edges []int, node1 int, node2 int) int { } return ans } - -type pair struct{ d, i int } -type hp []pair - -func (h hp) Len() int { return len(h) } -func (h hp) Less(i, j int) bool { return h[i].d < h[j].d } -func (h hp) Swap(i, j int) { h[i], h[j] = h[j], h[i] } -func (h *hp) Push(v any) { *h = append(*h, v.(pair)) } -func (h *hp) Pop() any { a := *h; v := a[len(a)-1]; *h = a[:len(a)-1]; return v } ``` #### TypeScript @@ -297,187 +293,50 @@ function closestMeetingNode(edges: number[], node1: number, node2: number): numb } ``` - - - - - - -### Solution 2 - - - -#### Python3 - -```python -class Solution: - def closestMeetingNode(self, edges: List[int], node1: int, node2: int) -> int: - def f(i): - dist = [inf] * n - dist[i] = 0 - q = deque([i]) - while q: - i = q.popleft() - for j in g[i]: - if dist[j] == inf: - dist[j] = dist[i] + 1 - q.append(j) - return dist - - g = defaultdict(list) - for i, j in enumerate(edges): - if j != -1: - g[i].append(j) - n = len(edges) - d1 = f(node1) - d2 = f(node2) - ans, d = -1, inf - for i, (a, b) in enumerate(zip(d1, d2)): - if (t := max(a, b)) < d: - d = t - ans = i - return ans -``` - -#### Java - -```java -class Solution { - private int n; - private List[] g; - - public int closestMeetingNode(int[] edges, int node1, int node2) { - n = edges.length; - g = new List[n]; - Arrays.setAll(g, k -> new ArrayList<>()); - for (int i = 0; i < n; ++i) { - if (edges[i] != -1) { - g[i].add(edges[i]); - } - } - int[] d1 = f(node1); - int[] d2 = f(node2); - int d = 1 << 30; - int ans = -1; - for (int i = 0; i < n; ++i) { - int t = Math.max(d1[i], d2[i]); - if (t < d) { - d = t; - ans = i; - } - } - return ans; - } - - private int[] f(int i) { - int[] dist = new int[n]; - Arrays.fill(dist, 1 << 30); - dist[i] = 0; - Deque q = new ArrayDeque<>(); - q.offer(i); - while (!q.isEmpty()) { - i = q.poll(); - for (int j : g[i]) { - if (dist[j] == 1 << 30) { - dist[j] = dist[i] + 1; - q.offer(j); - } - } - } - return dist; - } -} -``` +#### Rust -#### C++ +```rust +use std::collections::VecDeque; -```cpp -class Solution { -public: - int closestMeetingNode(vector& edges, int node1, int node2) { - int n = edges.size(); - vector> g(n); - for (int i = 0; i < n; ++i) { - if (edges[i] != -1) { - g[i].push_back(edges[i]); +impl Solution { + pub fn closest_meeting_node(edges: Vec, node1: i32, node2: i32) -> i32 { + let n = edges.len(); + let mut g = vec![Vec::new(); n]; + for i in 0..n { + if edges[i] != -1 { + g[i].push(edges[i] as usize); } } - const int inf = 1 << 30; - using pii = pair; - auto f = [&](int i) { - vector dist(n, inf); + let inf = 1 << 30; + let f = |mut i: usize| -> Vec { + let mut dist = vec![inf; n]; dist[i] = 0; - queue q{{i}}; - while (!q.empty()) { - i = q.front(); - q.pop(); - for (int j : g[i]) { - if (dist[j] == inf) { + let mut q = VecDeque::new(); + q.push_back(i); + while !q.is_empty() { + i = q.pop_front().unwrap(); + for &j in &g[i] { + if dist[j] == inf { dist[j] = dist[i] + 1; - q.push(j); + q.push_back(j); } } } - return dist; + dist }; - vector d1 = f(node1); - vector d2 = f(node2); - int ans = -1, d = inf; - for (int i = 0; i < n; ++i) { - int t = max(d1[i], d2[i]); - if (t < d) { + let d1 = f(node1 as usize); + let d2 = f(node2 as usize); + let mut ans = -1; + let mut d = inf; + for i in 0..n { + let t = std::cmp::max(d1[i], d2[i]); + if t < d { d = t; - ans = i; + ans = i as i32; } } - return ans; + ans } -}; -``` - -#### Go - -```go -func closestMeetingNode(edges []int, node1 int, node2 int) int { - n := len(edges) - g := make([][]int, n) - for i, j := range edges { - if j != -1 { - g[i] = append(g[i], j) - } - } - const inf int = 1 << 30 - f := func(i int) []int { - dist := make([]int, n) - for j := range dist { - dist[j] = inf - } - dist[i] = 0 - q := []int{i} - for len(q) > 0 { - i = q[0] - q = q[1:] - for _, j := range g[i] { - if dist[j] == inf { - dist[j] = dist[i] + 1 - q = append(q, j) - } - } - } - return dist - } - d1 := f(node1) - d2 := f(node2) - ans, d := -1, inf - for i, a := range d1 { - b := d2[i] - t := max(a, b) - if t < d { - d = t - ans = i - } - } - return ans } ``` diff --git a/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/Solution.cpp b/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/Solution.cpp index 8aae27a9953ee..626e5e2feb064 100644 --- a/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/Solution.cpp +++ b/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/Solution.cpp @@ -10,26 +10,24 @@ class Solution { } const int inf = 1 << 30; using pii = pair; - auto dijkstra = [&](int i) { + auto f = [&](int i) { vector dist(n, inf); dist[i] = 0; - priority_queue, greater> q; - q.emplace(0, i); + queue q{{i}}; while (!q.empty()) { - auto p = q.top(); + i = q.front(); q.pop(); - i = p.second; for (int j : g[i]) { - if (dist[j] > dist[i] + 1) { + if (dist[j] == inf) { dist[j] = dist[i] + 1; - q.emplace(dist[j], j); + q.push(j); } } } return dist; }; - vector d1 = dijkstra(node1); - vector d2 = dijkstra(node2); + vector d1 = f(node1); + vector d2 = f(node2); int ans = -1, d = inf; for (int i = 0; i < n; ++i) { int t = max(d1[i], d2[i]); diff --git a/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/Solution.go b/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/Solution.go index 052996ec8a859..2942464df6754 100644 --- a/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/Solution.go +++ b/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/Solution.go @@ -7,27 +7,27 @@ func closestMeetingNode(edges []int, node1 int, node2 int) int { } } const inf int = 1 << 30 - dijkstra := func(i int) []int { + f := func(i int) []int { dist := make([]int, n) for j := range dist { dist[j] = inf } dist[i] = 0 - q := hp{} - heap.Push(&q, pair{0, i}) + q := []int{i} for len(q) > 0 { - i := heap.Pop(&q).(pair).i + i = q[0] + q = q[1:] for _, j := range g[i] { - if dist[j] > dist[i]+1 { + if dist[j] == inf { dist[j] = dist[i] + 1 - heap.Push(&q, pair{dist[j], j}) + q = append(q, j) } } } return dist } - d1 := dijkstra(node1) - d2 := dijkstra(node2) + d1 := f(node1) + d2 := f(node2) ans, d := -1, inf for i, a := range d1 { b := d2[i] @@ -38,13 +38,4 @@ func closestMeetingNode(edges []int, node1 int, node2 int) int { } } return ans -} - -type pair struct{ d, i int } -type hp []pair - -func (h hp) Len() int { return len(h) } -func (h hp) Less(i, j int) bool { return h[i].d < h[j].d } -func (h hp) Swap(i, j int) { h[i], h[j] = h[j], h[i] } -func (h *hp) Push(v any) { *h = append(*h, v.(pair)) } -func (h *hp) Pop() any { a := *h; v := a[len(a)-1]; *h = a[:len(a)-1]; return v } \ No newline at end of file +} \ No newline at end of file diff --git a/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/Solution.java b/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/Solution.java index 0b0ec4b25ebc3..6cb9c23907765 100644 --- a/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/Solution.java +++ b/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/Solution.java @@ -11,8 +11,8 @@ public int closestMeetingNode(int[] edges, int node1, int node2) { g[i].add(edges[i]); } } - int[] d1 = dijkstra(node1); - int[] d2 = dijkstra(node2); + int[] d1 = f(node1); + int[] d2 = f(node2); int d = 1 << 30; int ans = -1; for (int i = 0; i < n; ++i) { @@ -25,19 +25,18 @@ public int closestMeetingNode(int[] edges, int node1, int node2) { return ans; } - private int[] dijkstra(int i) { + private int[] f(int i) { int[] dist = new int[n]; Arrays.fill(dist, 1 << 30); dist[i] = 0; - PriorityQueue q = new PriorityQueue<>((a, b) -> a[0] - b[0]); - q.offer(new int[] {0, i}); + Deque q = new ArrayDeque<>(); + q.offer(i); while (!q.isEmpty()) { - var p = q.poll(); - i = p[1]; + i = q.poll(); for (int j : g[i]) { - if (dist[j] > dist[i] + 1) { + if (dist[j] == 1 << 30) { dist[j] = dist[i] + 1; - q.offer(new int[] {dist[j], j}); + q.offer(j); } } } diff --git a/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/Solution.py b/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/Solution.py index 69e4b10c9ea89..d6b338ca128d3 100644 --- a/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/Solution.py +++ b/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/Solution.py @@ -1,15 +1,15 @@ class Solution: def closestMeetingNode(self, edges: List[int], node1: int, node2: int) -> int: - def dijkstra(i): + def f(i): dist = [inf] * n dist[i] = 0 - q = [(0, i)] + q = deque([i]) while q: - i = heappop(q)[1] + i = q.popleft() for j in g[i]: - if dist[j] > dist[i] + 1: + if dist[j] == inf: dist[j] = dist[i] + 1 - heappush(q, (dist[j], j)) + q.append(j) return dist g = defaultdict(list) @@ -17,8 +17,8 @@ def dijkstra(i): if j != -1: g[i].append(j) n = len(edges) - d1 = dijkstra(node1) - d2 = dijkstra(node2) + d1 = f(node1) + d2 = f(node2) ans, d = -1, inf for i, (a, b) in enumerate(zip(d1, d2)): if (t := max(a, b)) < d: diff --git a/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/Solution.rs b/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/Solution.rs new file mode 100644 index 0000000000000..6adeeb6babc8e --- /dev/null +++ b/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/Solution.rs @@ -0,0 +1,42 @@ +use std::collections::VecDeque; + +impl Solution { + pub fn closest_meeting_node(edges: Vec, node1: i32, node2: i32) -> i32 { + let n = edges.len(); + let mut g = vec![Vec::new(); n]; + for i in 0..n { + if edges[i] != -1 { + g[i].push(edges[i] as usize); + } + } + let inf = 1 << 30; + let f = |mut i: usize| -> Vec { + let mut dist = vec![inf; n]; + dist[i] = 0; + let mut q = VecDeque::new(); + q.push_back(i); + while !q.is_empty() { + i = q.pop_front().unwrap(); + for &j in &g[i] { + if dist[j] == inf { + dist[j] = dist[i] + 1; + q.push_back(j); + } + } + } + dist + }; + let d1 = f(node1 as usize); + let d2 = f(node2 as usize); + let mut ans = -1; + let mut d = inf; + for i in 0..n { + let t = std::cmp::max(d1[i], d2[i]); + if t < d { + d = t; + ans = i as i32; + } + } + ans + } +} diff --git a/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/Solution2.cpp b/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/Solution2.cpp deleted file mode 100644 index 626e5e2feb064..0000000000000 --- a/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/Solution2.cpp +++ /dev/null @@ -1,41 +0,0 @@ -class Solution { -public: - int closestMeetingNode(vector& edges, int node1, int node2) { - int n = edges.size(); - vector> g(n); - for (int i = 0; i < n; ++i) { - if (edges[i] != -1) { - g[i].push_back(edges[i]); - } - } - const int inf = 1 << 30; - using pii = pair; - auto f = [&](int i) { - vector dist(n, inf); - dist[i] = 0; - queue q{{i}}; - while (!q.empty()) { - i = q.front(); - q.pop(); - for (int j : g[i]) { - if (dist[j] == inf) { - dist[j] = dist[i] + 1; - q.push(j); - } - } - } - return dist; - }; - vector d1 = f(node1); - vector d2 = f(node2); - int ans = -1, d = inf; - for (int i = 0; i < n; ++i) { - int t = max(d1[i], d2[i]); - if (t < d) { - d = t; - ans = i; - } - } - return ans; - } -}; \ No newline at end of file diff --git a/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/Solution2.go b/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/Solution2.go deleted file mode 100644 index 2942464df6754..0000000000000 --- a/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/Solution2.go +++ /dev/null @@ -1,41 +0,0 @@ -func closestMeetingNode(edges []int, node1 int, node2 int) int { - n := len(edges) - g := make([][]int, n) - for i, j := range edges { - if j != -1 { - g[i] = append(g[i], j) - } - } - const inf int = 1 << 30 - f := func(i int) []int { - dist := make([]int, n) - for j := range dist { - dist[j] = inf - } - dist[i] = 0 - q := []int{i} - for len(q) > 0 { - i = q[0] - q = q[1:] - for _, j := range g[i] { - if dist[j] == inf { - dist[j] = dist[i] + 1 - q = append(q, j) - } - } - } - return dist - } - d1 := f(node1) - d2 := f(node2) - ans, d := -1, inf - for i, a := range d1 { - b := d2[i] - t := max(a, b) - if t < d { - d = t - ans = i - } - } - return ans -} \ No newline at end of file diff --git a/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/Solution2.java b/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/Solution2.java deleted file mode 100644 index 6cb9c23907765..0000000000000 --- a/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/Solution2.java +++ /dev/null @@ -1,45 +0,0 @@ -class Solution { - private int n; - private List[] g; - - public int closestMeetingNode(int[] edges, int node1, int node2) { - n = edges.length; - g = new List[n]; - Arrays.setAll(g, k -> new ArrayList<>()); - for (int i = 0; i < n; ++i) { - if (edges[i] != -1) { - g[i].add(edges[i]); - } - } - int[] d1 = f(node1); - int[] d2 = f(node2); - int d = 1 << 30; - int ans = -1; - for (int i = 0; i < n; ++i) { - int t = Math.max(d1[i], d2[i]); - if (t < d) { - d = t; - ans = i; - } - } - return ans; - } - - private int[] f(int i) { - int[] dist = new int[n]; - Arrays.fill(dist, 1 << 30); - dist[i] = 0; - Deque q = new ArrayDeque<>(); - q.offer(i); - while (!q.isEmpty()) { - i = q.poll(); - for (int j : g[i]) { - if (dist[j] == 1 << 30) { - dist[j] = dist[i] + 1; - q.offer(j); - } - } - } - return dist; - } -} \ No newline at end of file diff --git a/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/Solution2.py b/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/Solution2.py deleted file mode 100644 index d6b338ca128d3..0000000000000 --- a/solution/2300-2399/2359.Find Closest Node to Given Two Nodes/Solution2.py +++ /dev/null @@ -1,27 +0,0 @@ -class Solution: - def closestMeetingNode(self, edges: List[int], node1: int, node2: int) -> int: - def f(i): - dist = [inf] * n - dist[i] = 0 - q = deque([i]) - while q: - i = q.popleft() - for j in g[i]: - if dist[j] == inf: - dist[j] = dist[i] + 1 - q.append(j) - return dist - - g = defaultdict(list) - for i, j in enumerate(edges): - if j != -1: - g[i].append(j) - n = len(edges) - d1 = f(node1) - d2 = f(node2) - ans, d = -1, inf - for i, (a, b) in enumerate(zip(d1, d2)): - if (t := max(a, b)) < d: - d = t - ans = i - return ans