Skip to content

Commit c4f058d

Browse files
committed
Add groups function to Dsu
1 parent 2d81cf5 commit c4f058d

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

src/dsu.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,25 @@ impl Dsu {
4949
let x = self.leader(a);
5050
-self.parent_or_size[x] as usize
5151
}
52+
pub fn groups(&mut self) -> Vec<Vec<usize>> {
53+
let mut leader_buf = vec![0; self.n];
54+
let mut group_size = vec![0; self.n];
55+
for i in 0..self.n {
56+
leader_buf[i] = self.leader(i);
57+
group_size[leader_buf[i]] += 1;
58+
}
59+
let mut result = vec![Vec::new(); self.n];
60+
for i in 0..self.n {
61+
result[i].reserve(group_size[i]);
62+
}
63+
for i in 0..self.n {
64+
result[leader_buf[i]].push(i);
65+
}
66+
result
67+
.into_iter()
68+
.filter(|x| !x.is_empty())
69+
.collect::<Vec<Vec<usize>>>()
70+
}
5271
}
5372

5473
#[cfg(test)]
@@ -64,5 +83,6 @@ mod tests {
6483
assert_eq!(d.same(0, 2), true);
6584
assert_eq!(d.size(0), 3);
6685
assert_eq!(d.same(0, 3), false);
86+
assert_eq!(d.groups(), vec![vec![0, 1, 2], vec![3]]);
6787
}
6888
}

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,5 @@ pub(crate) mod internal_queue;
1717
pub(crate) mod internal_scc;
1818
pub(crate) mod internal_type_traits;
1919

20-
pub use fenwicktree::FenwickTree;
2120
pub use dsu::Dsu;
21+
pub use fenwicktree::FenwickTree;

0 commit comments

Comments
 (0)