問題はこちら
問題概要
行列のマスのうちいくつかを選ぶ. 行列のマスを選ぶと, 円失う. また, 行目のすべてのマスを選ぶと円得ることができ, 列目のすべてのマスを選ぶと円得ることができる. このとき最大何円得ることができるか.解説
マスを選ぶのではなく, 行や列を選びその行や列にあるマスをすべて選ぶようにする
(を選んだ時,行も列も使わないならを選ぶ必要がないため)
以下の条件で利得の最大化を行うことになる.
- 行目を選ぶと, 円を得る.
- 列目を選ぶと, 円を得る.
- ただし, 行目と列目のどちらも選ぶと上に加えて円を得る.
選ぶ/選ばないという選択と, 複数の選択の間に対する制約(罰則条件)があるのでProjectSelectionProblem(俗にいう燃やす埋める問題)を解くアルゴリズムを使えそう.
ProjectSelectionProblemについてはこちら
上の条件はすべて利得になっているのでProjectSelectionProblemに対応させるため損失に書き直す.
- 行目を選ぶと, 円を失う.
- 列目を選ぶと, 円を失う.
- ただし, 行目と列目のどちらも選ぶと上に加えて円を失う.
しかしこれだと3つ目の条件のコストが負になるのでうまくいかない.
まず行を選ぶ. その後列を選ぶとき, その列のまだ選んでないマスのコストだけ追加でコストがかかる, と考えると条件は以下のように変更できる.
- 行目を選ぶと, 円を得る.
- 列目を選ぶと, 円を得る.
- ただし, 列目を選んで行目を選んでいないときは円を失う.
先ほどと同様に条件を変更すると
- 行目を選ぶと, 円を失う.
- 列目を選ぶと, 円を失う.
- ただし, 列目を選んで行目を選んでいないときは円を失う.
これをグラフで表すと以下のようになる. 赤の頂点が行を表し, 青の頂点が列を表す.
まだ負のコストがあるので全体にを足すことで以下のように変更する.
このグラフのsからtまで流すときの最小カットをとすると
答えはとなる.(さっき足した分を引いている.)
頂点数は, 辺数はとなり間に合う.
また, sからに向かう辺のコストは0なので辺を張る必要はない.
燃やす埋める問題に関する基礎知識は以下の記事を参考にしてください.
kanpurin.hatenablog.com