辺に非負の重みを持つ無向グラフGと目標値kが与えられたとき、 辺連結度増大問題とは G の辺連結度(=最小カットの大きさ)が k になるように 増加すべき辺の重みの総和を最小にする問題である。 (ただし、ここでは、辺の無い2点間にも、重み0の辺から始め、重みを増やすことが できるとし、重みを整数値に限る必要がないとする。) このとき、このプログラムは、任意の目標値kに対して、問題の最適値L(k)と 1つの最適解G*(k)が即座に得られるデータ構造を求める。
まず、決められた目標値kから最適値L(k)は次のように求められる。 G の外に新しい点sを作り、s と G の間に適当に重み付きの辺を張り、 条件1:最小カットの大きさをk以上にする(ただし、sとGを分けるカットの 大きさはk未満でよい)。もし、s,G間のどの辺の重みも条件1を満たす範囲で 極小であれば、L(k)=(増加した重み和)/2 が成り立つ。 条件1を満たす極小な重みを求めるには、まず、次数(=点に接続する重み和)が k未満の各点vとsの間に(k-次数)の重みの辺を張っておき、以下をGの点が1つに なるまで反復する。 sから始まる最大隣接順序(MA ordering)を計算し、最後の2点を1点xに 縮約する(この2点間の局所辺連結度はk以上)。そして、縮約された点xの 次数がk未満であれば、sとxに縮約されているGの点との間で適当に 不足分の重みを増加する。
以上の計算を形式的にすべての目標値に対して同時に実行するために、 sとGの点の間に張る辺には単に重みをつけるのではなく、重複のない非負の 区間集合をつける(例えば、{[1,4],[6,8],[10,+infinity)})。 ここで、1つ目標値kが定まれば、各辺の重みはそれがもつ区間の k以下の部分の長さと定義される(例えば、先の例に対し、k=7なら、 重みは3+1=4と定められる)。実は、上の手続きは、この区間集合を作り替える ことですべての目標値に対する計算を模倣できることが知られている。
デモではこの様子を見ることができる。 Algorithm Startをクリックすると、新しい点(赤色)とグラフの点(黄色) をつなぐ枝(緑色)が生成される(枝の重みは便宜上十分大きな値Kから各点の 次数を引いたもの)。Nextをクリックすると、赤い点から最大隣接順序が計算 され、最後の2点が1点xに縮約される 縮約された点xの元のグラフにおける次数hを計算し、その 値が目標値kより小さければ、その点に縮約された点の持つ 区間(色が薄緑に変わる)を次のように変更する。区間を (必要ならば適当なところで切って) 値の小さくなるほうへ移動させ(桃色で表示)、 移動させた区間は重なりを持たないように hから値の大きくなるほうへ直列させる。
縮約するごとにこのように区間の変更を行うと、 最終的にGの各点に対し得られた区間集合から、与えられた目標値k に対し、重みを定め、その総和の半分の値をとればL(k)が得られる。 さらに、これらの区間集合の構造から与えられた目標値k に対する最適解G*(k)を次のように作ることができる。 すべての点の区間集合で、区間の先頭と末尾の値を整列し、a1,a2,...,ap とする(デモではこれらが色分けされる)。 ここで、[ai,ai+1]を区間の部分として持つ点の集合をV(i)で表し、 V(i)の点からなる1つの閉路をC(i)とする(C(i)はGの部分グラフでなくてよい)。 与えられたグラフGの重みを閉路C(1)に沿って(a2-a1)/2だけ増加し、 i=2,3,...の順に、C(i)に沿って(ai+1-ai)/2だけ増加していくとき、 増加の途中のグラフはGからの増加分を目標値とする最適解であることが 知られている
デモでは、最終の区間集合が得られると、画面右下にスクロールバーが 表示されるので、これにより目標値を自由に動かすことができる。 右上に、目標値(target value)、最適値(optimal value)が表示。 スクロールすることで解の階層構造を見ることができる(Algorithm Startをクリックする前に、グラフを自由に変更できる。 その後、Circularをクリックしていただくと節点が円環状に 配置され、最後の最適解の表示が見やすくなる)。
アルゴリズムの詳細については次を参照されたい。
H. Nagamochi and T. Ibaraki, Augmenting edge-connectivity over the entire range in O(nm) time, J. Algorithms, vol. 30, 1999, pp. 253-301.(永持 仁)