title | documentation_of |
---|---|
Incremental SCC (強連結成分) |
./incremental_scc.hpp |
この処理は以下のような用途に使える.
- UnionFind などのデータ構造を併用することで,各時点での強連結成分を管理できる.
- 各辺を含む閉路ができる時刻を重みとして最小全域木を求め,更に heavy-light decomposition やセグメント木と併用することで, 2 頂点が同一の強連結成分に初めて属する時刻をクエリ
等で計算できる.
vector<pair<int, int>> edges; // 有向辺の列. edges[i] は時刻 i に追加される
auto ticks = incremental_scc(edges);
assert(ticks.size() == edges.size());
// ticks[i] = (edges[i] を含む閉路ができる時刻 (0 <= ticks[i] < m)) または m (閉路ができない場合・自己ループの場合)