Skip to content

Commit 046c2c9

Browse files
committed
Create: 0684-redundant-connection.rs
1 parent ee7a3bc commit 046c2c9

File tree

1 file changed

+60
-0
lines changed

1 file changed

+60
-0
lines changed

rust/0684-redundant-connection.rs

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
use std::cmp::Ordering;
2+
3+
struct UnionFind {
4+
parent: Vec<usize>,
5+
rank: Vec<i32>,
6+
}
7+
8+
impl UnionFind {
9+
fn new(n: usize) -> Self {
10+
UnionFind {
11+
parent: (0..(n + 1)).collect(),
12+
rank: vec![1; n + 1],
13+
}
14+
}
15+
16+
fn find(&mut self, n: usize) -> usize {
17+
let mut p = self.parent[n];
18+
19+
while p != self.parent[p] {
20+
self.parent[p] = self.parent[self.parent[p]];
21+
p = self.parent[p];
22+
}
23+
24+
p
25+
}
26+
27+
fn union(&mut self, n1: usize, n2: usize) -> bool {
28+
let p1 = self.find(n1);
29+
let p2 = self.find(n2);
30+
31+
if p1 == p2 {
32+
return false;
33+
}
34+
match self.rank[p1].cmp(&self.rank[p2]) {
35+
Ordering::Greater => {
36+
self.parent[p2] = p1;
37+
self.rank[p1] += self.rank[p2];
38+
}
39+
_ => {
40+
self.parent[p1] = p2;
41+
self.rank[p2] = self.rank[p1];
42+
}
43+
}
44+
true
45+
}
46+
}
47+
48+
impl Solution {
49+
pub fn find_redundant_connection(edges: Vec<Vec<i32>>) -> Vec<i32> {
50+
let mut union_find = UnionFind::new(edges.len() + 1);
51+
52+
for edge in edges {
53+
let (n1, n2) = (edge[0] as usize, edge[1] as usize);
54+
if !union_find.union(n1, n2) {
55+
return vec![n1 as i32, n2 as i32];
56+
}
57+
}
58+
unreachable!()
59+
}
60+
}

0 commit comments

Comments
 (0)