月刊組合せ論 Natori は面白そうな組合せ論のトピックを紹介していく企画です。今回は競技プログラミングにも登場するマトロイドに入門していきます。タイトルの「入門しよう」には、筆者と共に入門しようという気持ちが込められています。つまり筆者も素人です。
ベクトル空間
#
ベクトル a=(1,−1,0),b=(0,1,−1),c=(3,−2,−1),d=(1,1,1) を考えます。c は c=3a+b と表せる一方、d は pa+qb の形で表すことができません。このような関係を表す概念として、線形独立と線形従属があります。
ベクトルの集合 X={x1,…,xn} が線形独立であるとは、a1x1+⋯+anxn=0 ならば a1=⋯=an=0 が成り立つことをいいます。そうでないとき X は線形従属であるといいます。例えば {a,b,d} は線形独立ですが、{a,b,c} は 3a+b−c=0 をみたすので線形従属です。
X が線形独立ならば、部分集合 Y⊂X も線形独立です。さらに次の性質が成り立ちます。
命題: X,Y はベクトル空間 V の線形独立な部分集合で ∣X∣>∣Y∣ をみたすとする。このときある x∈X∖Y であって Y∪{x} が線形独立であるものが存在する。
証明: もしすべての x∈X∖Y について Y∪{x} が線形従属であったとすると、X の元はすべて Y の元の線形結合として表せる。Y を基底とする部分空間の次元は ∣Y∣ で、∣X∣>∣Y∣ であることから X は線形従属となる。これは矛盾である。
グラフ
#
グラフは頂点と辺からなるものです。厳密にはグラフ G は頂点集合 V(G) と辺集合 E(G) の組で、E(G) は V(G) の非順序対 {x,y} からなります。ここでは x=y とします。
グラフ G のサイクルとは、頂点の列 (v1,v2,…,vn) (ただし n≥3 とする) であって {v1,v2},{v2,v3},…,{vn−1,vn},{vn,v1} が辺であるものをいいます。森とは、サイクルをもたない部分グラフのことをいいます。
命題: X,Y はグラフ G の森で、∣E(X)∣>∣E(Y)∣ をみたすとする。このときある辺 e∈E(X)∖E(Y) であって Y∪{e} が森であるものが存在する。
証明: すべての e∈E(X)∖E(Y) について Y∪{e} が森ではないと仮定する。また V(X)=V(Y)=V(G) とする。r(X) を X の連結成分の個数とするとき、r(X)=∣V(X)∣−∣E(X)∣ より r(X)<r(Y) が成り立つ。一方、e={u,v}∈E(X) に対して、頂点 u,v は Y の同じ連結成分に属する。このことから r(X)≥r(Y) となる。これは矛盾である。
マトロイド
#
マトロイドはベクトル空間とグラフに対する上述の性質を抽象化したものです。
E を有限集合、I を E の部分集合からなる集合とします。(E,I) がマトロイドであるとは
- ∅∈I
- X∈I,Y⊂X ならば Y∈I
- X,Y∈I,∣X∣>∣Y∣ ならばある x∈X∖Y について Y∪{x}∈I
をみたすことをいいます。X∈I であるとき、X は独立であるといいます。
1, 2 をみたす場合、(E,I) は独立性システムであるといいます。
ランク関数
#
マトロイド (E,I) に対してランク関数 r:2E→Z+ を r(X)=max{∣Y∣∣Y⊆X,Y∈I} により定めます。すると
- 0≤r(X)≤∣X∣
- Y⊆X ならば r(Y)≤r(X)
- r(X)+r(Y)≥r(X∪Y)+r(X∩Y)
が成り立ちます。最初の 2 つは明らかです。三番目の不等式は劣モジュラ性と呼ばれています。
逆を考えることもできます。E は有限集合で関数 r:2E→Z+ は上の 3 つの条件をみたすとします。
I={X⊆E∣r(X)=∣X∣}とおくと、(E,I) はマトロイドになります。証明は省略します。
このように、マトロイドはランク関数によって導入することもできます。他にも様々なマトロイドの特徴づけが知られています。次のセクションではアルゴリズムによってマトロイドを特徴づける話を紹介します。
貪欲法
#
「マトロイドは貪欲法」というフレーズを聞いたことがある人もいるかもしれません。実は、貪欲法が上手く動くこととマトロイドであることが同値になります。これを正確に述べます。
(E,I) を独立性システムとします。各 e∈E に対して重み w(e)∈R≥0 が定まっているとします。求めたいものは、極大独立集合 B であって重みの和 ∑e∈Bw(e) が最小となるものです。この問題に対して、次のような貪欲法を考えます。
w(e1)≤⋯≤w(en) となるように E の元に e1,…,en と名前を付けます。まず B=∅ とします。i=1,2,…,n の順に次の操作を行います。
- B∪{ei}∈I ならば B に ei を加える。
最終的な B が出力です。
このアルゴリズムは本当に最小コストの極大独立集合を出力するでしょうか?
定理: (E,I) を独立性システムとする。任意の関数 w:E→R≥0 に対して貪欲法が最小コストの極大独立集合を出力することと、(E,I) がマトロイドであることは同値である。
なお極大独立集合のことは基ともいいます。基の要素数は等しいことが知られており、以下の証明でも用いられます。
まずはマトロイドならば貪欲法が上手く動くことを示します。貪欲法の出力が B={x1,…,xr} で、x1,…,xr の順に加えられたとします。もちろん w(x1)≤⋯≤w(xr) です。B′={y1,…,yr}∈I (w(y1)≤⋯≤w(yr)) が最適解であるとします。このとき任意の i に対して w(xi)≤w(yi) が成り立つことを示します。そうでないと仮定すると、w(xk)>w(yk) となる k が存在します。このような k のうち最小のものをとり、S={x1,…,xk−1},T={y1,…,yk} を考えます。∣T∣=∣S∣+1 なので、マトロイドの性質よりある j (1≤j≤r) について S∪{yj}∈I となります。しかし w(yj)≤w(yk)<w(xk) なので、貪欲法の動かし方と合いません。
次に貪欲法が上手く動くならばマトロイドであることを示します。マトロイドでないとすると、ある独立集合 A,B は ∣A∣=∣B∣+1 をみたすが、任意の a∈A∖B について B∪{a} が独立ではありません。重みを
w(x)=⎩⎨⎧w1w2w3w4x∈A∩Bx∈B∖Ax∈A∖Botherwiseとします。まず w1<w2<w3<w4 とします。貪欲法は、まず A∩B の元をすべて選び、B∖A の元をすべて選びます。仮定より A∖B の元は選びません。B は極大独立集合でないので、X∖(A∪B) から選ばれます。m を極大独立集合の要素数としたとき、コストは
∣A∩B∣w1+∣B∖A∣w2+(m−∣B∣)w4となります。これが最適でないことを示したいので、A,B の役割を変えて得られるコスト
∣A∩B∣w1+∣A∖B∣w3+(m−∣A∣)w4の方が小さいようにしたいです。この不等式は
w4>∣A∖B∣w3−∣B∖A∣w2と変形できます。これが成り立つように w1,w2,w3,w4 を具体的に定めることができますが、これは読者の演習問題とします。
また、最小を最大に置き換えても類似の定理が成り立ちます。
競技プログラミングにおける具体例
#
競技プログラミングにおいてマトロイドが現れる例をいくつか紹介します。
代表的な例は最小全域木です。マトロイドはグラフの一般化だったことを思い出すと、サイクルのないグラフのうち辺の数が極大なものが基 (極大独立集合) です。グラフが連結であるとすると、基は全域木です。するとマトロイドに対する貪欲法を用いることで最小全域木が求められます。このアルゴリズムにはクラスカル法という名前がついています。
他にも、AtCoder Beginner Contest 236 F - Spices がマトロイドの考え方で解けます。その他のマトロイドが現れる問題はぜひ詳しい人に聞いてみてください。
競技プログラミングとマトロイドに関する記事は色々あります。いくつかピックアップして紹介します。
おわりに
#
マトロイドの基礎を紹介しました。筆者も素人なので、詳しい人からのコメントをお待ちしております。
高度な話題も、勉強が進めば記事にしたいと思っています。
今後も月刊組合せ論 Natori では組合せ論の様々な話題をお届けする予定なので、応援のほどよろしくお願いいたします。
参考文献
#