今回は木幅(tree-width)の話を書いてみようと思います。
木幅とは、大雑把に言うとグラフがどれだけ木に近いかを表す値です(木に近いほど小さな値になります)。NP困難な問題でもグラフを木に限定すると多項式時間で解けたりする話は有名ですが、実は一部のNP困難な問題は、グラフの木幅が定数で上から抑えられるなら、なんと線形時間で解くことができます!
今回はそのようなNP困難問題の一つである最大独立集合問題を取り上げて、木幅が定数で抑えられるときの線形時間アルゴリズムを紹介することを目標に記事を書いていこうと思います。
1. 木分解と木幅
木幅を定義する前に、まずは木分解(tree-decomposition)を定義します。木分解とは、グラフを木構造として表現したものです。ちなみにグラフは無向グラフのみを考えます。
定義(木分解)
グラフに対して、頂点集合の部分集合族とを節点として持つ木の組であって、以下を満たすものをの木分解という。
- の和集合は
- において辺で結ばれている任意の2点に対して、、を両方とも含むが存在する
- の任意の頂点に対して、を含む全体は上で連結
イメージとしては、の各頂点に、を含む全体がなすの部分木が対応しています。で頂点との間に辺があるなら、に対応するの部分木とに対応するの部分木が交わりを持つ(つまり、を両方含むの節点が存在する)という構造になっています。
例を見てみます。
左が元のグラフ、右が左のグラフの木分解です。先ほどの木分解の定義の1~3を満たしていることが確認できます。
木分解が定義できたので、今度は木分解の幅と、グラフの木幅を定義します。
定義(幅、木幅)
グラフのある木分解の幅とは、のことである*1。また、グラフの木幅twとは、の全ての木分解の幅のうちの最小値である。
例えば、上の例における木分解の幅は2です。また、上の例におけるグラフは実は木幅も2です(つまり上に描いた木分解は幅が最小の木分解です)。
一般のグラフの木幅をすぐに求めるのは難しいですが、グラフクラスを限定すると木幅がすぐにわかったりします。例えば木の木幅は1であり(逆に連結なグラフで木幅が1なら木です)、また外平面的グラフ*2の木幅は2以下です。これを聞くと、確かに木幅が小さいほど木に近いグラフであるような気分になりますね*3。
さて、実は与えられたグラフの幅最小の木分解を求めるのはNP困難問題です。ですが、木幅が定数で上から抑えられるなら、以下のBodlaenderの定理を用いて(に関する)線形時間で幅最小の木分解を求めることができます。
定理(Bodlaender 1996)
各定数に対して、以下を(を定数と見たときに)時間で行える。
入力として与えられたグラフに対して、その木幅が以下であるか否かを判定し、もし以下なら幅以下の木分解を構成する。
与えられたグラフの木幅が定数で上から抑えられるとします。このとき、Bodlaenderの定理をについて順番にに適用するか二部探索すれば、幅最小の木分解を(を定数とみると)合計時間で得ることができます。これで幅最小の木分解を求める線形時間アルゴリズムが得られました。
(木幅が定数で抑えられるグラフに対する)最大独立集合問題の線形時間アルゴリズムも、この幅最小の木分解を求める線形時間アルゴリズムを使っています。このことは次の章以降で紹介していきます。
2. Nice Tree-decomposition
さて、グラフの幅最小の木分解が得られたとします。この木分解上でDPをまわすことで最大独立集合が求められるのですが、そのままDPをすると割と面倒です。そこでnice tree-decomposition と呼ばれるDPがしやすい木分解にあらかじめ変形しておいて、その木分解上でDPをまわす、ということがよく行われます*4。というわけで、この章では木分解上のDPを紹介する前にnice tree-decompositionを紹介しようと思います。
nice tree-decompositionとは、DPがしやすいように単純な構造しか持たないようにした木分解です。
定義(Nice Tree-decomposition)
nice tree-decompositionとは、木分解で、をある節点を根とした根付き木とみたときに以下を満たすもの*5。
- 全てのは高々2つの子しか持たない
- が2つの子、を持つなら、が成り立つ
- が1つの子を持つなら、のある頂点が存在してまたはが成り立つ
2.を満たすのことをjoin、3.を満たすのうちを満たすものをintroduce、を満たすものをforgetと呼びます。
例えば、木分解の定義の後で例に挙げたグラフのnice tree-decompositionは以下のようになります(一意ではありません)。
さて、(木幅が定数で抑えられるグラフに対して)幅最小の木分解が時間で得られることは前の章で説明しましたが、実はある木分解から同じ幅のnice tree-decompositionを得ることも(幅を定数として)時間で可能です。
補題
グラフの木分解に対して、同じ幅のnice tree-decompositionを(幅を定数として)時間で得ることができる。
証明)
与えられた木分解をとする。まず、の適当な節点を根と定めて、を根付き木として見る。次に、以下の3ステップの操作によりを変形することで、同じ幅のnice tree-decompositionを構成する。
- 3つ以上子を持つ節点の子を2つに減らす
- 節点が2つの子、を持ち、が成り立たない場合、の子を変える
- 節点が1つの子を持ち、「のある頂点が存在してまたはが成り立つ」という関係が成り立たないとき、との間に節点を追加する
この変形は木分解の条件を保ち、また木分解の幅も変化しない。また、コピーのほうのの子は2つであり、コピーでないほうのの子はもともとの個数よりも1つ少なくなっている。つまり、に対してこれと同じ変形をまた施し、これを(子が3つ以上の)すべての節点について帰納的に繰り返せば、有限回の変形によってすべての節点の子を2つ以下にすることができる。これによって増える節点の個数はの辺の数以下なので、ステップ1.が終わった後の節点数はのままである。またステップ1.全体にかかる時間計算量は、幅を定数とみれば時間である。ステップ1.が完了すると、nice tree-decompositionの定義の1つ目の条件が満たされていることになる。
次にステップ2.について、節点が2つの子、を持ち、が成り立たないとする。このとき、新たにのコピーを2つ作り、と、との間にそれぞれ挿入する(下図参照)。
この変形は木分解の条件を保ち、また木分解の幅も変化しない。この変形をステップ2.の条件に当てはまるすべての節点に対して行えば、nice tree-decompositionの定義の2つ目の条件が満たされることになる。ステップ2.全体で増える節点数、かかる時間計算量は幅を定数とみればともにである。
次にステップ3.について、節点が1つの子を持ち、「のある頂点が存在してまたはが成り立つ」という関係が成り立たないとする。とする。このとき、まずとの間にを挿入する。次にとの間にを挿入する。次にとの間にを挿入する...と繰り返し、最終的にとの間にを挿入する。ちなみにである。
についても同様の操作を行う。つまり、まずとの間にを挿入する。次にとの間にを挿入する...と繰り返し、最終的にとの間にを挿入する(に注意)。
例えば、の場合は下図のように節点が挿入される。
この変形をステップ3.の条件に当てはまるすべての節点に対して行えば、nice tree-decompositionの3つ目の条件が満たされる。またこの変形は木分解の条件を保ち、幅も変化しない。また、集合、の要素数は木分解の幅+1以下なので、1つの親と子の組に対してステップ3.の変形を行うことで増える節点数は、高々木分解の幅×2+1である。よって幅を定数とみれば、ステップ3.終了後の節点数はである。また、幅を定数とみればステップ3.全体でかかる時間計算量もである。
以上より、ステップ1、2、3によって、与えられた木分解から同じ幅で節点数のnice tree-decompositionが時間で得られることがわかる。
3. Nice Tree-decomposition上のDP
木幅が定数で抑えられるグラフが与えられたとします。すると、1章で述べた通り、幅最小の木分解を時間で得ることができます。また、2章の補題よりと同じ幅のnice tree-decompositionを時間で得ることができます。ここで、なので、これらを合わせることで合計時間で節点数で幅最小のnice tree-decompositionを得ることができます。
さて、幅最小のnice tree-decompositionが線形時間で得られることがわかったので、以下ではいよいよnice tree-decomposition上のDPによって最大独立集合問題が解けることを紹介していきます。
まず、最大独立集合問題に限らず木分解上でのDPは、次のように行われます。
- 木分解に対して、適当な節点を選んでの根と定める*6
- の各節点に対して、グラフを、とその子孫全体の和集合を頂点集合としてもつの誘導部分グラフ*7と定める
- について解きたい問題を、各について解くことで最終的に(なので)についても解く
- が子を持っていたとき、について解きたい問題をについて解いた結果を用いて解く
上のDPについて、少し疑問を抱く方もいるかもしれません。つまり、について解きたい問題を、について解いた結果を用いて簡単に解けるのでしょうか?
のある2つの子との両方に含まれる頂点が存在したとします。このとき、はにも必ず含まれます。なぜかというと、を含むの節点全体は連結なので、またはその子孫と、またはその子孫を結ぶ道上にあるにもが含まれるからです。
また、に含まれる辺は、に含まれる辺か、両端点がに含まれる辺のどちらかです。なぜかというと、のある辺の2端点をとすると、またはその子孫でを含むもの、を含むものが少なくとも1つずつあります。また、との間には辺があるので、はを同時に含む節点を持ちます。ここで、上でを含む節点全体、を含む節点全体はそれぞれ連結なので、またはその子孫でを両方とも含むものが必ず存在します。つまり、辺はのいずれかに含まれるか、端点がに含まれるかのどちらかが成り立ちます。
よって、についての問題をについての結果を用いて解く際に、頂点の重複や新しく追加される辺という意味で考慮しなくてはいけないのはまわりだけなので、のサイズが小さい(つまり木分解の幅が小さい)なら高速にDPをまわして解くことができます。これが木分解上のDPの強みです。
では、実際に最大独立集合問題に対するnice tree-decomposition上でのDPを見ていきましょう。
最大独立集合問題に対するDP
nice tree-decompositionが与えられたとする。の節点とその部分集合に対して、をの独立集合のうちを満たすものの最大サイズと定める。を次のように更新していく。なおの子は1つの場合、2つの場合、と表すことにする。また、がintrodece、forgetのときのとの差となる頂点をとする。
が葉、forgetの場合の式については少し考えれば成り立つことがわかると思います。がjoinの場合の式は、のうちに含まれない頂点と、のうちに含まれない頂点との間に辺がないことから成り立ちます。また、がintroduceで、の場合については、のうちに含まれない頂点との間には辺がないことに注意すると、ととの間に辺がなければ、とを満たすの独立集合との間にも辺がないので、が成り立ちます。
与えられたnice tree-decompositionの幅が定数、の節点数がだとします。すると、このDPの時間計算量は、定数時間で終わる更新を回行うので、合計時間かかります。よって、(木幅が定数で抑えられるグラフに対して)幅最小のnice tree-decompositionが線形時間で得られることもあわせて、最大独立集合問題が線形時間で解けることが示されました。
4. おまけ
前の章で、木幅が定数で抑えられるグラフに対して最大独立集合問題が線形時間で解けることを示しました。実は、もっと一般的に次のような事実が成り立ちます。
定理(Courcelle 1990)
木幅が定数で抑えられるグラフと単項二階論理式で表現できるグラフについての命題が与えられたとき、グラフが命題を満たすかどうかを線形時間で判定できる
(グラフについての)単項二階論理式とは次の表現を組み合わせて記述できる論理式のことです。
- 論理結合子
- 頂点、辺に関する量化子
- 述語adj()(との間に辺があるなら1を、ないなら0を返す)
- 述語inc()(がの端点なら1を、そうでないなら0を返す)
- 頂点集合、辺集合に関する量化子
- 頂点集合、辺集合に関する
例えば、グラフが二部グラフである、独立集合である、閉路がある、3彩色可能、などの命題は単項二階論理式で表現可能です。
Coucelleの定理については証明とかも追ってなくてあまりよく知らないので、そのうちちゃんと勉強したいなと思います。
*1:なぜ1を引いているのかというと、木の木幅を1にするためです。
*2:外平面的グラフとは、すべての頂点が外面に面していて、かつ辺は交差しないような平面埋め込みをもつグラフです。例えば木分解の例のところで登場したグラフは外平面的グラフです。
*3:ならない人もいるかもしれません。
*4:nice tree-decompositionに変形せずにそのままDPをする場合の解法はWikipediaに漸化式などが載っています。この漸化式も本質的にはnice tree-decompositionに変形してからDPする場合の漸化式と同じです。
*5:葉と根は必ず空集合という条件を定義に含む流儀などもありますが、今回はそれは採用しませんでした。
*6:nice tree-decompositionに変形した場合はすでに根が定まっています。
*7:がの誘導部分グラフであるとは、がの部分グラフであり、かつ両端点がどちらもに含まれるようなの辺はすべてにも含まれるグラフのことをいいます