pub fn scc<V, E>(
n: usize,
vs: impl Iterator<Item = V>,
index: impl Fn(&V) -> usize + Copy,
delta: impl Fn(&V) -> E + Copy
) -> Vec<usize>where
E: Iterator<Item = V>,
Expand description
lowlink に基づく強連結成分分解。
Parameters
n
: 頂点数vs
: 頂点集合index
: 頂点から添字への番号づけをする関数delta
: 頂点v
と関数search
を受け取る関数
delta
は、v
の各隣接頂点 nv
に対して、search(nv)
を呼び出す必要がある。
Return value
index(v)
番目の要素が v
の属する強連結成分の番号である配列。
番号づけはトポロジカル順に行われる。
Examples
(0) ---> (1) ---> (3) ---> (5) ---> (6) ---> (7)
^ | | ^ ^ |
| v v | | |
(4) <--- (2) (9) +------ (8) <-----+
use nekolib::graph::scc;
let g = vec![
vec![1],
vec![2, 3],
vec![4],
vec![5, 9],
vec![0],
vec![6],
vec![7],
vec![8],
vec![5, 6],
vec![],
];
let index = |&v: &usize| v;
let delta = |&v: &usize| g[v].iter().cloned();
let comp_id = scc(10, 0..10, index, delta);
assert_eq!(comp_id, vec![0, 0, 0, 1, 0, 3, 3, 3, 3, 2]);
Complexity
$O(|V|+|E|)$ 時間。