SCC

有向グラフを強連結成分分解します。

コンストラクタ

var graph = init_scc_graph(n:int)

$n$ 頂点 $0$ 辺の有向グラフを作る。

制約

計算量

add_edge

graph.add_edge(src:int, dst:int):void

頂点 from から頂点 to へ有向辺を足す。

制約

計算量

scc

graph.scc():seq[seq[int]]

以下の条件を満たすような、「頂点のリスト」のリストを返します。

計算量

追加した辺の本数を $m$ として

使用例

AC code of https://atcoder.jp/contests/practice2/tasks/practice2_g

include atcoder/header import atcoder/scc as scc_lib let n, m = nextInt() var g = init_scc_graph(n) for i in 0..<m: let u, v = nextInt() g.add_edge(u, v) var scc = g.scc() echo scc.len for v in scc: echo v.len, " ", v.join(" ")