haar_lib/graph/
bridges.rs1pub use crate::graph::lowlink::*;
4
5pub fn bridges(ll: &Lowlink) -> Vec<(usize, usize)> {
9 let Lowlink { ord, low, ch, .. } = ll;
10
11 ch.iter()
12 .enumerate()
13 .flat_map(|(i, es)| {
14 es.iter()
15 .filter_map(|&j| (ord[i] < low[j]).then_some((i, j)))
16 .collect::<Vec<_>>()
17 })
18 .collect()
19}
20
21#[cfg(test)]
22mod tests {
23 use super::*;
24 use crate::graph::*;
25
26 #[test]
27 fn test() {
28 let mut g = Graph::<Undirected, _>::new(4);
30 g.extend(
31 vec![(0, 1), (0, 2), (1, 2), (2, 3)]
32 .into_iter()
33 .map(|(u, v)| Edge::new(u, v, (), ())),
34 );
35 let mut ans = bridges(&Lowlink::new(&g));
36 ans.sort();
37 assert_eq!(ans, [(2, 3)]);
38
39 let mut g = Graph::<Undirected, _>::new(5);
40 g.extend(
41 vec![(0, 1), (1, 2), (2, 3), (3, 4)]
42 .into_iter()
43 .map(|(u, v)| Edge::new(u, v, (), ())),
44 );
45 let mut ans = bridges(&Lowlink::new(&g));
46 ans.sort();
47 assert_eq!(ans, [(0, 1), (1, 2), (2, 3), (3, 4)]);
48 }
49}