yukicoder No.957 植林
問題はこちら
問題概要
解説
マスを選ぶのではなく, 行や列を選びその行や列にあるマスをすべて選ぶようにする
(
以下の条件で利得の最大化を行うことになる.
行目を選ぶと,
円を得る.
列目を選ぶと,
円を得る.
- ただし,
行目と
列目のどちらも選ぶと上に加えて
円を得る.
選ぶ/選ばないという選択と, 複数の選択の間に対する制約(罰則条件)があるのでProjectSelectionProblem(俗にいう燃やす埋める問題)を解くアルゴリズムを使えそう.
ProjectSelectionProblemについてはこちら
上の条件はすべて利得になっているのでProjectSelectionProblemに対応させるため損失に書き直す.
行目を選ぶと,
円を失う.
列目を選ぶと,
円を失う.
- ただし,
行目と
列目のどちらも選ぶと上に加えて
円を失う.
しかしこれだと3つ目の条件のコストが負になるのでうまくいかない.
まず行を選ぶ. その後列を選ぶとき, その列のまだ選んでないマスのコストだけ追加でコストがかかる, と考えると条件は以下のように変更できる.
行目を選ぶと,
円を得る.
列目を選ぶと,
円を得る.
- ただし,
列目を選んで
行目を選んでいないときは
円を失う.
先ほどと同様に条件を変更すると
行目を選ぶと,
円を失う.
列目を選ぶと,
円を失う.
- ただし,
列目を選んで
行目を選んでいないときは
円を失う.
これをグラフで表すと以下のようになる. 赤の頂点が行を表し, 青の頂点が列を表す.

まだ負のコストがあるので全体にを足すことで以下のように変更する.

このグラフのsからtまで流すときの最小カットをとすると
答えはとなる.(さっき足した分を引いている.)
頂点数は, 辺数は
となり間に合う.
また, sからに向かう辺のコストは0なので辺を張る必要はない.
燃やす埋める問題に関する基礎知識は以下の記事を参考にしてください.
kanpurin.hatenablog.com