Skip to content

Commit c4a3da0

Browse files
authored
feat: add rust solution to lc problem: No.1697 (#1132)
1 parent e15b28b commit c4a3da0

File tree

3 files changed

+214
-0
lines changed

3 files changed

+214
-0
lines changed

solution/1600-1699/1697.Checking Existence of Edge Length Limited Paths/README.md

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,79 @@ public:
276276
};
277277
```
278278
279+
### **Rust**
280+
281+
```rust
282+
impl Solution {
283+
#[allow(dead_code)]
284+
pub fn distance_limited_paths_exist(n: i32, edge_list: Vec<Vec<i32>>, queries: Vec<Vec<i32>>) -> Vec<bool> {
285+
let mut disjoint_set: Vec<usize> = vec![0; n as usize];
286+
let mut ans_vec: Vec<bool> = vec![false; queries.len()];
287+
let mut q_vec: Vec<usize> = vec![0; queries.len()];
288+
289+
// Initialize the set
290+
for i in 0..n {
291+
disjoint_set[i as usize] = i as usize;
292+
}
293+
294+
// Initialize the q_vec
295+
for i in 0..queries.len() {
296+
q_vec[i] = i;
297+
}
298+
299+
// Sort the q_vec based on the query limit, from the lowest to highest
300+
q_vec.sort_by(|i, j| queries[*i][2].cmp(&queries[*j][2]));
301+
302+
// Sort the edge_list based on the edge weight, from the lowest to highest
303+
let mut edge_list = edge_list.clone();
304+
edge_list.sort_by(|i, j| i[2].cmp(&j[2]));
305+
306+
let mut edge_idx: usize = 0;
307+
for q_idx in &q_vec {
308+
let s = queries[*q_idx][0] as usize;
309+
let d = queries[*q_idx][1] as usize;
310+
let limit = queries[*q_idx][2];
311+
// Construct the disjoint set
312+
while edge_idx < edge_list.len() && edge_list[edge_idx][2] < limit {
313+
Solution::union(
314+
edge_list[edge_idx][0] as usize,
315+
edge_list[edge_idx][1] as usize,
316+
&mut disjoint_set
317+
);
318+
edge_idx += 1;
319+
}
320+
// If the parents of s & d are the same, this query should be `true`
321+
// Otherwise, the current query is `false`
322+
ans_vec[*q_idx] = Solution::check_valid(s, d, &mut disjoint_set);
323+
}
324+
325+
ans_vec
326+
}
327+
328+
#[allow(dead_code)]
329+
pub fn find(x: usize, d_set: &mut Vec<usize>) -> usize {
330+
if d_set[x] != x {
331+
d_set[x] = Solution::find(d_set[x], d_set);
332+
}
333+
return d_set[x];
334+
}
335+
336+
#[allow(dead_code)]
337+
pub fn union(s: usize, d: usize, d_set: &mut Vec<usize>) {
338+
let p_s = Solution::find(s, d_set);
339+
let p_d = Solution::find(d, d_set);
340+
d_set[p_s] = p_d;
341+
}
342+
343+
#[allow(dead_code)]
344+
pub fn check_valid(s: usize, d: usize, d_set: &mut Vec<usize>) -> bool {
345+
let p_s = Solution::find(s, d_set);
346+
let p_d = Solution::find(d, d_set);
347+
p_s == p_d
348+
}
349+
}
350+
```
351+
279352
### **Go**
280353

281354
```go

solution/1600-1699/1697.Checking Existence of Edge Length Limited Paths/README_EN.md

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,79 @@ public:
149149
};
150150
```
151151
152+
### **Rust**
153+
154+
```rust
155+
impl Solution {
156+
#[allow(dead_code)]
157+
pub fn distance_limited_paths_exist(n: i32, edge_list: Vec<Vec<i32>>, queries: Vec<Vec<i32>>) -> Vec<bool> {
158+
let mut disjoint_set: Vec<usize> = vec![0; n as usize];
159+
let mut ans_vec: Vec<bool> = vec![false; queries.len()];
160+
let mut q_vec: Vec<usize> = vec![0; queries.len()];
161+
162+
// Initialize the set
163+
for i in 0..n {
164+
disjoint_set[i as usize] = i as usize;
165+
}
166+
167+
// Initialize the q_vec
168+
for i in 0..queries.len() {
169+
q_vec[i] = i;
170+
}
171+
172+
// Sort the q_vec based on the query limit, from the lowest to highest
173+
q_vec.sort_by(|i, j| queries[*i][2].cmp(&queries[*j][2]));
174+
175+
// Sort the edge_list based on the edge weight, from the lowest to highest
176+
let mut edge_list = edge_list.clone();
177+
edge_list.sort_by(|i, j| i[2].cmp(&j[2]));
178+
179+
let mut edge_idx: usize = 0;
180+
for q_idx in &q_vec {
181+
let s = queries[*q_idx][0] as usize;
182+
let d = queries[*q_idx][1] as usize;
183+
let limit = queries[*q_idx][2];
184+
// Construct the disjoint set
185+
while edge_idx < edge_list.len() && edge_list[edge_idx][2] < limit {
186+
Solution::union(
187+
edge_list[edge_idx][0] as usize,
188+
edge_list[edge_idx][1] as usize,
189+
&mut disjoint_set
190+
);
191+
edge_idx += 1;
192+
}
193+
// If the parents of s & d are the same, this query should be `true`
194+
// Otherwise, the current query is `false`
195+
ans_vec[*q_idx] = Solution::check_valid(s, d, &mut disjoint_set);
196+
}
197+
198+
ans_vec
199+
}
200+
201+
#[allow(dead_code)]
202+
pub fn find(x: usize, d_set: &mut Vec<usize>) -> usize {
203+
if d_set[x] != x {
204+
d_set[x] = Solution::find(d_set[x], d_set);
205+
}
206+
return d_set[x];
207+
}
208+
209+
#[allow(dead_code)]
210+
pub fn union(s: usize, d: usize, d_set: &mut Vec<usize>) {
211+
let p_s = Solution::find(s, d_set);
212+
let p_d = Solution::find(d, d_set);
213+
d_set[p_s] = p_d;
214+
}
215+
216+
#[allow(dead_code)]
217+
pub fn check_valid(s: usize, d: usize, d_set: &mut Vec<usize>) -> bool {
218+
let p_s = Solution::find(s, d_set);
219+
let p_d = Solution::find(d, d_set);
220+
p_s == p_d
221+
}
222+
}
223+
```
224+
152225
### **Go**
153226

154227
```go
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
impl Solution {
2+
#[allow(dead_code)]
3+
pub fn distance_limited_paths_exist(n: i32, edge_list: Vec<Vec<i32>>, queries: Vec<Vec<i32>>) -> Vec<bool> {
4+
let mut disjoint_set: Vec<usize> = vec![0; n as usize];
5+
let mut ans_vec: Vec<bool> = vec![false; queries.len()];
6+
let mut q_vec: Vec<usize> = vec![0; queries.len()];
7+
8+
// Initialize the set
9+
for i in 0..n {
10+
disjoint_set[i as usize] = i as usize;
11+
}
12+
13+
// Initialize the q_vec
14+
for i in 0..queries.len() {
15+
q_vec[i] = i;
16+
}
17+
18+
// Sort the q_vec based on the query limit, from the lowest to highest
19+
q_vec.sort_by(|i, j| queries[*i][2].cmp(&queries[*j][2]));
20+
21+
// Sort the edge_list based on the edge weight, from the lowest to highest
22+
let mut edge_list = edge_list.clone();
23+
edge_list.sort_by(|i, j| i[2].cmp(&j[2]));
24+
25+
let mut edge_idx: usize = 0;
26+
for q_idx in &q_vec {
27+
let s = queries[*q_idx][0] as usize;
28+
let d = queries[*q_idx][1] as usize;
29+
let limit = queries[*q_idx][2];
30+
// Construct the disjoint set
31+
while edge_idx < edge_list.len() && edge_list[edge_idx][2] < limit {
32+
Solution::union(
33+
edge_list[edge_idx][0] as usize,
34+
edge_list[edge_idx][1] as usize,
35+
&mut disjoint_set
36+
);
37+
edge_idx += 1;
38+
}
39+
// If the parents of s & d are the same, this query should be `true`
40+
// Otherwise, the current query is `false`
41+
ans_vec[*q_idx] = Solution::check_valid(s, d, &mut disjoint_set);
42+
}
43+
44+
ans_vec
45+
}
46+
47+
#[allow(dead_code)]
48+
pub fn find(x: usize, d_set: &mut Vec<usize>) -> usize {
49+
if d_set[x] != x {
50+
d_set[x] = Solution::find(d_set[x], d_set);
51+
}
52+
return d_set[x];
53+
}
54+
55+
#[allow(dead_code)]
56+
pub fn union(s: usize, d: usize, d_set: &mut Vec<usize>) {
57+
let p_s = Solution::find(s, d_set);
58+
let p_d = Solution::find(d, d_set);
59+
d_set[p_s] = p_d;
60+
}
61+
62+
#[allow(dead_code)]
63+
pub fn check_valid(s: usize, d: usize, d_set: &mut Vec<usize>) -> bool {
64+
let p_s = Solution::find(s, d_set);
65+
let p_d = Solution::find(d, d_set);
66+
p_s == p_d
67+
}
68+
}

0 commit comments

Comments
 (0)