2020年12月5日土曜日

CS Academy Round #66 - Flipping Matrix

操作を逆順に見る。単位行列の行や列を入れ換えていくと、次のことがわかる:

  • 行と列の間に11による一対一対応があるという性質は交換で保たれる。(→ 置換行列
  • 任意の二行の交換はある二列の交換と同一操作であり、任意の二列の交換はある二行の交換と同一操作である。

逆に、初期配置から11を共通に含む行と列を1対1に対応させることができれば、この対応を1つの置換と考えることができ、互換を繰り返すことによって単位置換(=単位行列)に戻せる。また、あらゆる置換は高々N1N-1個の互換の積で表せるので、NN回以下という制限は問題にならない。結局、やることは次のようにまとまる:

  1. N×NN \times Nの二部グラフGGをつくり、Aij=1A_{ij}=1なら行に対応する頂点iiから列に対応する頂点jjに辺を張る。
  2. GGの最大二部マッチングMMを求める。MMが完全マッチングでなければ実行不能である。
  3. MMを一つの置換とみなして巡回置換に分解し、さらに互換に分解する。互換に従って行の交換を行う。