From 046c2c97b74087d41ab3e4eef3fdc12de7175042 Mon Sep 17 00:00:00 2001 From: AkifhanIlgaz Date: Sun, 15 Jan 2023 18:21:25 +0300 Subject: [PATCH] Create: 0684-redundant-connection.rs --- rust/0684-redundant-connection.rs | 60 +++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 rust/0684-redundant-connection.rs diff --git a/rust/0684-redundant-connection.rs b/rust/0684-redundant-connection.rs new file mode 100644 index 000000000..b550ce0f6 --- /dev/null +++ b/rust/0684-redundant-connection.rs @@ -0,0 +1,60 @@ +use std::cmp::Ordering; + +struct UnionFind { + parent: Vec, + rank: Vec, +} + +impl UnionFind { + fn new(n: usize) -> Self { + UnionFind { + parent: (0..(n + 1)).collect(), + rank: vec![1; n + 1], + } + } + + fn find(&mut self, n: usize) -> usize { + let mut p = self.parent[n]; + + while p != self.parent[p] { + self.parent[p] = self.parent[self.parent[p]]; + p = self.parent[p]; + } + + p + } + + fn union(&mut self, n1: usize, n2: usize) -> bool { + let p1 = self.find(n1); + let p2 = self.find(n2); + + if p1 == p2 { + return false; + } + match self.rank[p1].cmp(&self.rank[p2]) { + Ordering::Greater => { + self.parent[p2] = p1; + self.rank[p1] += self.rank[p2]; + } + _ => { + self.parent[p1] = p2; + self.rank[p2] = self.rank[p1]; + } + } + true + } +} + +impl Solution { + pub fn find_redundant_connection(edges: Vec>) -> Vec { + let mut union_find = UnionFind::new(edges.len() + 1); + + for edge in edges { + let (n1, n2) = (edge[0] as usize, edge[1] as usize); + if !union_find.union(n1, n2) { + return vec![n1 as i32, n2 as i32]; + } + } + unreachable!() + } +} \ No newline at end of file