G - Sort from 1 to 4 解説 by harurun4635


おそらく、どこかにて提案はされている解法だとは思いますが、改めて記しておきます。


終状態はソートされた数列です。これは一意に定まるので、 \(B\) とします。

すべての \(i\) に対して、\(A_i\) から \(B_i\) へ有向辺をはった \(4\) 頂点のグラフを考えます。(自己辺については認めることにします。また、のちの議論のために形式的に辺番号を \(i\) とします)

このとき、以下のようなアルゴリズムが正当に回ります。

グラフに存在するサイクルのうち、最もサイクル長が短いものを取り除き「サイクル長 \(- 1\)」 を答えに加算する。 \(\cdots\)(☆)

最終的にすべての辺が取り除かれたとき、それが答えとなる。

これが正当であることを示すのは簡単ではありませんが(おそらくこれまで解説が書かれなかった要因の一番です)丁寧に追っていきます。

まず、用語の定義をしておきます。(これは一般的なものとは異なるものもあるので注意です)


極小なサイクル

あるサイクルが2つ以上のサイクルに分解されないとき、「極小なサイクル」とよびます。

オイラーグラフ

すべての頂点において「入次数」と「出次数」が等しい有向グラフを「オイラーグラフ」とよびます。(一般的にオイラーグラフには連結性を要求することが多いですが、ここでは連結性を要求しません)

また、辺の数が \(0\) のグラフはオイラーグラフと呼ばないことにします。

操作列

この問題における操作列を

\((i_1, j_1), (i_2, j_2), \dots , (i_q, j_q)\)

と書くことにします。これは、\(i_k\)\(j_k\) をswapするという操作を \(k = 1,2, \dots ,q\) と順番にしていったものです。


命題1

アルゴリズム(☆)は「サイクル数の最大値」を得ることができる。

補題2

オイラーグラフはサイクルを含む

簡単な証明

ある辺を1つ選んで伸ばしていくことを考えます。

行き止まりがないので、いずれ通った頂点に戻ってくるはずです。(通った頂点に戻ってくる前に行き止まりがあるとすると、入次数が $1$ であるのに出次数が $0$ の頂点があることとなり矛盾します)

通った頂点に戻ってきたとき、サイクルができています。

補題3

アルゴリズム(☆)は停止する

証明

サイクルを取り除いていったとき、「$0$ 辺ではないが、サイクルも存在しないグラフ」ができたと仮定します。

サイクルもオイラーグラフであることに留意すると、オイラーグラフからサイクルを取り除いたものは明らかにオイラーグラフです。よって、補題2よりサイクルが存在するはずなので矛盾します。

よって、必ず $0$ 辺になり、アルゴリズムは停止します。

補題4

アルゴリズム(☆)で得られるサイクルの数は、サイクルの数が最大化される。

証明

そもそも、これは一般の $N$ 頂点では成立しません。(要反例)よって、$4$ 頂点の場合のみの証明を与えます。(また、グラフの足し引きを定義なしに用いていますが、辺集合に対する演算だと思ってください。あまり厳密にしなくても大意は理解できると思います)

補題3から、取り除く順番によって停止しなくなることはないため、単に解が悪化しないことを示せば十分です。解が悪化するとは、「そのサイクルを取り除かなければ、サイクル数が増えた」という状況を指します。そのような状況が起こり得ないことを示します。

このアルゴリズムにおいて $5$ 辺以上のサイクルは存在しません。なぜならば、同じ頂点を $2$ 回以上用いるサイクルは自明に極小ではないから、そのようなサイクルはすでに取り除かれているはずだからです。よって、以下で考えるサイクルはすべて極小なサイクルです。(また、ここから考えなければならないサイクルの種類数が $O(1)$ であるのでアルゴリズムが十分高速にまわることもわかります)

「あるサイクル $X$ 」を取り除いたときに、解が悪化すると仮定します。このとき、「あるサイクル $X$ に含まれる辺がすべておなじサイクル $Y$ に使われること」はありません。なぜなら、そのようなサイクル $Y$ は、サイクル $X$ と $Y - X$ に分解できるためです。

まず、 $1$ 辺のサイクルに関しては、明らかに上の議論から取り除いて良いです。($1$ 辺しか無いので、必ず同じサイクルに使われます)

$2$ 辺のサイクル $X$ について考えます。$X$ にふくまれる $2$ 辺が異なる $2$ つのサイクル $Y, Z$ に使われたとしても、その $2$ つのサイクルを組み替えれば $X$ と $Y+Z-X$ の $2$ つのサイクルにできるため、$2$ 辺も取り除いてよいです。(これは一般のグラフで成り立ちます)

$3$ 辺のサイクル $X$ について考えます。(このとき、既に $2$ 辺以下のサイクルはすべて取り除かれていることに注意します)上の $2$ 辺の議論を考えれば、$3$ 辺が $2$ つのサイクルに分かれる場合は取り除いて良いこととなります。

よって、$3$ 辺はすべて異なる(極小な)サイクル $Y,Z,W$に含まれるとして良いです。しかし、そのような異なる $3$ つのサイクルであって、$Y + Z + W$ が「 $2$ 辺以下のサイクルを含まない」ものは存在しません。それを示します。

まず、$X$ に含まれない頂点を $u$ と置きます。この頂点は $Y,Z,W$ のいずれにも含まれます。なぜならば、そうでないときは(そのサイクル自体が) $2$ 辺のサイクルを含むか、$X$ と一致するためです。 $Y+Z+W$ において、 $u$ に向かう辺も $u$ から伸びる辺も $3$ 本ありますが、$2$ 辺のサイクルが無いことを考えると、向かう辺か伸びる辺のどちらかは $X,Y,Z$ で一致します。(鳩の巣原理を考えればわかります)すると、ある頂点において、入次数または出次数が $4$ となり、これはあるサイクルが $2$ 回以上おなじ頂点を用いていることとなります。しかし、これは極小であることに矛盾します。

$4$ 辺のサイクルは明らかに取り除いてよいです( $4$ 辺が最大より、解の悪化のしようがありません)

よって、サイクルの数が悪化することはないために、サイクルの数は最大化されています。


命題5

極小なサイクルに対して、そのサイクルに含まれる辺番号を順に列挙したものを \(S = [ i_1, i_2, \dots, i_s ]\) とする。

このとき、\(S\) に含まれる index に対してのみ \(B\) にする操作を考えると、操作回数の下界は \(s - 1\) であり、それを達成する操作列が存在する。

補題6

\((i_1, i_2), (i_2, i_3) \dots , (i_{s-1}, i_s)\) という操作列は下界を達成する操作列である。(これを「サイクル操作列」と呼ぶ)

証明

まず、明らかに操作回数は「$s - 1$ 」です。

$(i_1, i_2)$ を操作したとき、元のグラフを考えると、$i_1$ と $i_2$ の始点が入れかわります。$i_1$ については $A_{i_1} = B_{i_1}$ となります。そして、$i_2$ の始点は $i_s$ の終点と一致します。

そのため、新しいサイクルとして $i_2, i_3, \dots ,i_s$ というサイクルができます。これを繰り返すことで、この操作列が得られます。

補題7

この操作回数を下回るような操作列は存在しない(下界である)

証明

そのような操作列が存在すると仮定します。

このとき、操作列を辺として解釈したグラフを考えます。集合 $S$ に存在する要素は $s$ 個であるのに対して、辺の本数( $=$ 操作回数)は高々 $s-2$ ですから、少なくとも $2$ つ以上の連結成分にわかれます。

連結成分に含まれる index のみに着目すると、これは元問題とおなじ状況です。よって、連結成分は $1$ つ以上のサイクルに分解できることはずなので、元のサイクルは $2$ つ以上のサイクルに分解されます。よって「極小のサイクル」であることに矛盾します。


命題8

あらゆるvalidな操作列は、いくつかのサイクル操作列に解を悪化させることなく帰着できる。

証明

補題7と同様に、操作列を辺として解釈したグラフについて、連結成分ごとに考えます。まず、その連結成分の大きさを $s$ とすれば、明らかに操作が $s-1$ 回以上含まれます。

その連結成分は同様に $1$ つ以上の極小なサイクル( $c$ 個とします)に分解できます。そのサイクルに対して「サイクル操作列」を行うと、操作回数は $s -c$ となります。これは、 $s-1$ 以下なので示されました。


命題5・8から、考えるべき操作列は「いくつかのサイクル操作列」に分解したもののみを考えればよいです。そして、このときの操作回数を最小化するのは、サイクル数が最大化されたときです。(サイクルが最大化されたとき、すべてのサイクルは極小であるはずです)

よって、命題1からアルゴリズム(☆)が正当であることが示されました。

投稿日時:
最終更新: