pub mod connectivity;
pub mod flow;
pub mod util;
pub struct DisjointSets {
parent: Vec<usize>,
}
impl DisjointSets {
pub fn new(size: usize) -> Self {
Self {
parent: (0..size).collect(),
}
}
pub fn find(&mut self, u: usize) -> usize {
let pu = self.parent[u];
if pu != u {
self.parent[u] = self.find(pu);
}
self.parent[u]
}
pub fn merge(&mut self, u: usize, v: usize) -> bool {
let (pu, pv) = (self.find(u), self.find(v));
self.parent[pu] = pv;
pu != pv
}
}
pub struct Graph {
first: Vec<Option<usize>>,
next: Vec<Option<usize>>,
endp: Vec<usize>,
}
impl Graph {
pub fn new(vmax: usize, emax_hint: usize) -> Self {
Self {
first: vec![None; vmax],
next: Vec::with_capacity(emax_hint),
endp: Vec::with_capacity(emax_hint),
}
}
pub fn num_v(&self) -> usize {
self.first.len()
}
pub fn num_e(&self) -> usize {
self.endp.len()
}
pub fn add_edge(&mut self, u: usize, v: usize) {
self.next.push(self.first[u]);
self.first[u] = Some(self.num_e());
self.endp.push(v);
}
pub fn add_undirected_edge(&mut self, u: usize, v: usize) {
self.add_edge(u, v);
self.add_edge(v, u);
}
pub fn add_two_sat_clause(&mut self, u: usize, v: usize) {
self.add_edge(u ^ 1, v);
self.add_edge(v ^ 1, u);
}
pub fn adj_list(&self, u: usize) -> AdjListIterator {
AdjListIterator {
graph: self,
next_e: self.first[u],
}
}
}
pub struct AdjListIterator<'a> {
graph: &'a Graph,
next_e: Option<usize>,
}
impl<'a> Iterator for AdjListIterator<'a> {
type Item = (usize, usize);
fn next(&mut self) -> Option<Self::Item> {
self.next_e.map(|e| {
let v = self.graph.endp[e];
self.next_e = self.graph.next[e];
(e, v)
})
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_adj_list() {
let mut graph = Graph::new(5, 6);
graph.add_edge(2, 3);
graph.add_edge(2, 4);
graph.add_edge(4, 1);
graph.add_edge(1, 2);
graph.add_undirected_edge(0, 2);
let adj = graph.adj_list(2).collect::<Vec<_>>();
assert_eq!(adj, vec![(5, 0), (1, 4), (0, 3)]);
for (e, v) in adj {
assert_eq!(v, graph.endp[e]);
}
}
}