competitive_programming_rs/data_structure/
union_find.rs1pub struct UnionFind {
2 parent: Vec<usize>,
3 sizes: Vec<usize>,
4 size: usize,
5}
6
7impl UnionFind {
8 pub fn new(n: usize) -> UnionFind {
9 UnionFind {
10 parent: (0..n).map(|i| i).collect::<Vec<usize>>(),
11 sizes: vec![1; n],
12 size: n,
13 }
14 }
15
16 pub fn find(&mut self, x: usize) -> usize {
17 if x == self.parent[x] {
18 x
19 } else {
20 let px = self.parent[x];
21 self.parent[x] = self.find(px);
22 self.parent[x]
23 }
24 }
25
26 pub fn unite(&mut self, x: usize, y: usize) -> bool {
27 let parent_x = self.find(x);
28 let parent_y = self.find(y);
29 if parent_x == parent_y {
30 return false;
31 }
32
33 let (large, small) = if self.sizes[parent_x] < self.sizes[parent_y] {
34 (parent_y, parent_x)
35 } else {
36 (parent_x, parent_y)
37 };
38
39 self.parent[small] = large;
40 self.sizes[large] += self.sizes[small];
41 self.sizes[small] = 0;
42 self.size -= 1;
43 true
44 }
45}
46
47#[cfg(test)]
48mod test {
49 use super::*;
50 use crate::utils::test_helper::Tester;
51
52 #[test]
54 fn solve_dsl_1_a() {
55 let tester = Tester::new("./assets/DSL_1_A/in/", "./assets/DSL_1_A/out/");
56
57 tester.test_solution(|sc| {
58 let n = sc.read();
59 let q = sc.read();
60 let mut uf = UnionFind::new(n);
61 for _ in 0..q {
62 let com: usize = sc.read();
63 let x = sc.read();
64 let y = sc.read();
65 if com == 0 {
66 uf.unite(x, y);
67 } else {
68 let ans = if uf.find(x) == uf.find(y) { 1 } else { 0 };
69 sc.write(format!("{}\n", ans));
70 }
71 }
72 });
73 }
74}