LowLinkの紹介
- 2024/07/30 追記:LowLink の持つデータの項において
の定義に誤りがあったため修正しました。\text{low}(v)
この記事は、「木 Advent Calendar 2023」の19日目です。
きのうはまぐふらいさんの「2-SATを解く」でした。
あしたは箱さんの「木に関する数学の論文の紹介」です。
グラフの特徴量、 LowLink について紹介します。
グラフのDFS
無向グラフ上で DFS (深さ優先探索) をすると、ひとつの全域木が構築されます。これを DFS 木とよびます。
なお、有向グラフの場合は、全域森が構築されます。
DFS 木を構築したあと、グラフの辺は 4 種類に分けることができます。
- 木辺 (tree edge): DFS 木に属する辺
- 木辺以外の辺:
- 後退辺 (back edge): ひとつの DFS 木上で、子孫から先祖への辺
- 有向グラフで後退辺が存在する場合、サイクルが存在します。
- 先行辺 (forward edge): (有向グラフの場合のみ存在)ひとつの DFS 木上で、先祖から子孫への辺
- 横断辺 (cross edge): (有向グラフの場合のみ存在)結ぶ頂点が先祖・子孫の関係にない辺
- 後退辺 (back edge): ひとつの DFS 木上で、子孫から先祖への辺
LowLink の持つデータ
LowLink は各頂点について定義される以下のふたつの値です。
-
: DFSで頂点\text{ord}(v) を訪れた順番(何番目か)v -
: 木辺を\text{low}(v) 回以上、0 木辺以外の辺を後退辺を 回以上通って1 回以下通って到達可能な頂点の1 の最小値\text{ord}
これを持つと、以下のようなことができます。
LowLink の求め方
LowLink はシンプルな DFS によって求めることができます。
説明は省略します。
→実装 (Rust)
橋の列挙
辺
このとき、
(なぜなら、
二重辺連結成分の列挙
橋をすべて消すと、残りはすべて二重辺連結成分になる。
あとは DFS なりで連結成分をまとめる。
関節点の列挙
頂点
- 根のとき: 子が
つ以上あれば関節点2 - それ以外のとき:
の子であってu であるような\text{ord}(u) \le \text{low}(v) が存在すれば関節点v
二重頂点連結成分の列挙
関節点をすべて消すと、残りはすべて二重頂点連結成分になる。
あとはがんばる。
強連結成分分解
LowLink をしながら求める。
スタックを用意し、 DFS の行きがけのタイミングで訪れた頂点 push する。
DFS の帰りがけのタイミングで、
強連結成分が得られる順番は、トポロジカルの逆順になる。
参考
- https://ei1333.github.io/library/graph/others/low-link.hpp.html
- https://kagamiz.hatenablog.com/entry/2013/10/05/005213
- https://tubo28.me/compprog/algorithm/tarjan-scc/
- https://www.geeksforgeeks.org/tree-back-edge-and-cross-edges-in-dfs-of-graph/
Discussion