関節点、橋とlowlinkの行間
はじめに
関節点とは、無向グラフの頂点であって削除すると連結成分の数が増えるもののことです。
橋とは、無向グラフの辺であって削除すると連結成分の数が増えるもののことです。
lowlinkとは、関節点や橋を線形時間で求められる手法です。
これらについての解説は沢山ありますが、読んだ時に言葉ではいまいちピンと来なかった部分があったのでこの記事では図を使って行間を埋めることを目的とします。
解説や実装例そのものは良いものが沢山あるのでここでは扱いません。
良いものの例
関節点、橋の判定方法
lowlinkでは各連結成分について、適当な根を決めたうえ(本当に何でもいい)それぞれの頂点について以下2つの値を求めます。
ord
low
これらを用いて、
- 頂点
が根のとき、i に子が2つ以上あればi は関節点i - 頂点
が根でないとき、i に ordi low[i]\leq になるような子[j] が存在すればj は関節点i - DFS木上で頂点
とi の子i を結ぶ辺j が ord(i,j) low[i]< なら[j] は橋(i,j) - (DFS木上にない辺は自明に橋ではない)
と判定することができます。
ピンと来なかった点1: 判定式の微妙な違い
判定式が関節点では
なので補足するためにミニマムな絵を描きます。
関節点の判定
まず、左の連結グラフからlowlinkによって右のようなDFS木ができたとします。
①このとき頂点
②また、頂点
橋の判定
③次に、辺
④また、辺
等号の有無
ここで、①と④は同じ辺を判定に使っていますが等号の有無によって判定結果が変わっています。
絵をグっと睨むと頂点
また、同様にそのような辺
これで私は納得しました。
ピンと来なかった点2: 根の判定条件
頂点
と見て、いやいや部分木同士が後退辺で繋がってたら
例えばこんな絵です。頂点
絵をじっと見ます。
…これはDFS木でしょうか。
違います。
元のグラフをDFSすると頂点
このDFS木上で頂点
これで私は納得しました。
以上
Discussion