AtCoder Grand Contest 037 D - Sorting a Grid
問題
行列が与えられる。次の操作を行ってをに変換するとき、その途中経過であるを1つ求める。
- の行ごとに好きに並び替えてにする
- の列ごとに好きに並び替えてにする
- の行ごとに好きに並び替えてにする
考察
の満たすべき条件を考える。 まず、の要素は、それぞれの行ごとに同じ色がついているとみなす。 つまり、行目の要素の色はである。 は、行の並び替えだけでになるために、の各行も同じ色で、なおかつ、各列には、色の要素がそれぞれ1つずつ存在する。 の変換では列ごとの要素が変わらないので、はこの制約をみたす必要がある。
の列目について、行それぞれに色を分配する方法を考える。 行目にを入れられるかは、の行目にがあるかどうかで決まる。 そこで、行を表す個の頂点と色を表す個の頂点を持った頂点のグラフを考え、行目にがあるなら、これらに対応する頂点同士に辺を張る。 これで、どの行にどの色を割り当てるかを、完全マッチングで決められる。 一度使った要素はその行から削除する。 ここで、次の補題(証明は後述)より、残りの列も同様に繰り返すことで要素を決めることができる。
制約を満たすような任意の列の割り当てをおこなったとき、残りの列も制約を満たすマッチングが存在する
以上でを構築できた。 はを列ごとに昇順に並べればよい。
証明
[補題]制約を満たすような任意の列の割り当てをおこなったとき、残りの列も制約を満たすマッチングが存在する
列残っているとき、各色の要素もちょうど色ずつ残っている。 それぞれの行について、要素が1つ以上存在するので、その行と辺を張った色が1つ以上存在する。 また、それぞれの色について、少なくとも1つ以上の行に入っているので、その色と辺を張った行が1つ以上存在する。 以上より、色に対して行のマッチングがあるので、ホールの定理より、制約を満たすマッチングが存在する。