燃やす埋める問題
燃やす埋める問題は以下の問題である
- 頂点を赤と青に塗り分ける
- 塗り方の依存関係によってスコアが変動する
(例) 頂点 が赤で頂点 が青に割り当てられたとき 失う - スコアの和の最小化を行え
この問題は最小カットに帰着して解くことができる
- 必ず赤が割り当てられる頂点,必ず青が割り当てられる頂点を用意
- 頂点から頂点への最小カットを求める
- スコアが変動する条件によって辺を張る
辺の張り方
頂点 が赤で頂点 が青ならば 失う
このとき「頂点から頂点に容量の辺」を張ればよいことを基本とする
頂点を赤で塗ると失う
頂点 が赤で頂点 が青ならば 失うと言い換えられる
頂点 から頂点 に容量 の辺を張る
頂点を青で塗ると失う
頂点 が赤で頂点 が青ならば 失うと言い換えられる
頂点 から頂点 に容量 の辺を張る
頂点を赤で塗ると得る
- 無条件に 得る
- (頂点 が赤で) 頂点 が青ならば 失う と言い換えられる.
- 無条件に 得る
- 頂点 から頂点 に容量 の辺を張る
頂点を青で塗ると得る
- 無条件に 得る
- 頂点 が赤で (頂点 が青) ならば 失う と言い換えられる.
- 無条件に 得る
- 頂点 から頂点 に容量 の辺を張る
頂点 が赤で頂点 が赤ならば 得る
新たな頂点 を用意し
- 無条件に 得る
- 頂点 が青だと 失う
- 頂点 が赤ならば,必ず頂点 は赤
- 頂点 が赤ならば,必ず頂点 は赤
と帰着する.「必ず頂点 は赤」は「頂点 が青ならば 失う」と言い換えられる
- 無条件に 得る
- 頂点 から頂点 に容量 の辺を張る
- 頂点 から頂点 に容量 の辺を張る
- 頂点 から頂点 に容量 の辺を張る
頂点 が青で頂点 が青ならば 得る
赤の場合と同様に,新たな頂点 を用意し
- 無条件に 得る
- 頂点 が赤だと 失う
- 頂点 が青ならば,必ず頂点 は青
- 頂点 が青ならば,必ず頂点 は青
と帰着する.「必ず頂点 は青」は「頂点 が赤ならば 失う」と言い換えられる
- 無条件に 得る
- 頂点 から頂点 に容量 の辺を張る
- 頂点 から頂点 に容量 の辺を張る
- 頂点 から頂点 に容量 の辺を張る
頂点 が赤で頂点 が赤ならば 失う
基本的には難しいがグラフが二部グラフの性質から可能なこともある.辺の順序を入れ替え,「頂点 が赤で頂点 が青ならば 失う」のように辺を張ればよい.グラフの張り方については問題例のイルミネーションにも書いた.
(参考) 最小カットを使って「燃やす埋める問題」を解く by shindanninさん のp55,蟻本p359
頂点 が赤で頂点 が青ならば 得る
新たな頂点 を用意し
- 無条件に 得る
- 頂点 が赤ならば 失う
- 頂点 が青ならば頂点 は赤
- 頂点 が青ならば頂点 は青
と帰着する.頂点 が青ならば頂点 は赤 頂点 が青,頂点 が青ならば 失う となるが前述したようにこれは二部グラフでないと厳しい.以下の画像のように辺を張ると, が青 もしくは が赤 のとき への辺が残っているので の辺を切らなければならない.
以下に各状況においてどのような辺を張るべきかまとめる
依存関係 | グラフの辺の張り方 |
---|---|
が赤のとき 失う | から へ容量 |
が赤のとき 得る | 「無条件で得る」「 から へ容量 」 |
が青のとき 失う | から へ容量 |
が青のとき 得る | 「無条件で得る」「 から へ容量 」 |
が赤で が青なら 失う | から へ容量 |
が赤で が赤なら 得る | 「無条件に 得る」「頂点 から頂点 に容量 の辺を張る」「頂点 から頂点 に容量 の辺を張る」「頂点 から頂点 に容量 の辺を張る」 |
が青で が青なら 得る | 「無条件に 得る」「頂点 から頂点 に容量 の辺を張る」「頂点 から頂点 に容量 の辺を張る」「頂点 から頂点 に容量 の辺を張る」 |
頂点 が赤で頂点 が赤ならば 失う | 二部グラフなら辺の順序入れ替えで帰着 |
頂点 が青で頂点 が青ならば 失う | 二部グラフなら辺の順序入れ替えで帰着 |
(参考)
project selection problem
- LPとグラフと定式化 by とこはるさん の3.1節
- 最小カットとProject Selection Problemのまとめ by kimiyukiさん
- Project Selection (燃やす埋める) 周りの話についてもう少し考えた by とこはるさん
3状態に割り振るタイプの問題
KUPC2019 H - 123パズル のように各頂点を3状態に割り振るタイプの問題について考える.自分で考えたことが含まれるので間違ってるかも.
頂点 に を割り振るとする.以下のグラフで辺 をそれぞれ を表すとする.
に容量 の辺を張っておく.これによってS-Tカットで が 側ならば も 側に含まれる制約を表せる.
だと 失う
KUPC2019 H - 123パズル の解説 を一般化できないかと思い考えたもの
頂点 から頂点 に容量 の辺を張る.S-Tカットで頂点 は 側,頂点 は 側に含まれる場合,この辺を切らなければならない.この辺を切らなければならないS-Tカットに相当する について 失う制約条件を表すことができる.
以下の組合せで表現できる ならグラフで表わせる
に容量 の辺を張る
S-Tカットが以下のときこの辺を切らなければならない
- に相当
- に相当
- に相当
がのいずれかの場合失う
に容量 の辺を張る
がのいずれか
に容量 の辺を張る
がのいずれか
に容量 の辺を張る
がのいずれか
に容量 の辺を張る
任意の
に容量 の辺を張る
がのいずれか
に容量 の辺を張る
がのいずれか
に容量 の辺を張る
がのいずれか
に容量 の辺を張る
がのいずれか
に容量 の辺を張る
が
に容量 の辺を張る
が のいずれか
に容量 の辺を張る
が のいずれか
に容量 の辺を張る
が のいずれか
に容量 の辺を張る
が
に容量 の辺を張る
が のいずれか
に容量 の辺を張る
が のいずれか
に容量 の辺を張る
が
に容量 の辺を張る
が のいずれか
に容量 の辺を張る
が のいずれか
一様加算できる領域は縦横1列と右上,左下のあたり
可能な についてシンプルな形で表現できるのかはよくわからなかったが,左下・右上にあるものほど失うスコアが大きいならばつくれそう.
Project Selection (燃やす埋める) 周りの話についてもう少し考えた by とこはるさん に
集合の切り分け方が部分集合関係の鎖になっていることが本質的な気がしてきます。
という視点が書いてあった
だと 失う
「任意のについて だと 失う」に対応する辺はあるのでこれは表現できる.
なら , なら , なら の辺を張ればよい.
だと 得る
燃やす埋めると同様に変形を行う.
無条件で 得られるとして ならば 失うとすればいい.
- ならば と の辺
- ならば と の辺
- ならば と の辺
----- ToDo -----
だと 得るは表現できる?
以外の領域全てに加算できるのならつくれそう
これ以外の表現方法ある?
----- ToDo -----
問題例
ARC085 E - MUL
頂点を割らない(側),割る(側)の2種類に分割する問題と考える
が割られていた場合, の倍数は割られていなければならない.これは の倍数が割られていて, が割られていない状況を禁止(失う)とすればよい.グラフでは の倍数から へ容量 の辺を張ることに相当する.
のとき,頂点 を割らなければ 失う.グラフでは から へ容量 の辺を張ることに相当する.
のとき,頂点 を割らなければ 得る.グラフでは,「無条件で 得る」「 から に容量 の辺を張る」ことに相当する.
(無条件で得た分) - (このグラフの最小カット) が答えとなる.
https://atcoder.jp/contests/arc085/submissions/8072769
RUPC2019day2 H - Ghost
幽霊 が左を向いている(側),右を向いている(側) の2種類に分割すると考える
以下の制約を組み込んだグラフをつくれればよい
- 幽霊 が元々向いていた方と反対側になった場合失う
- が右,が左を向いていたら失う (となるようにする)
これは燃やす埋めるで表せるのでグラフを構成して最小カットを求めることで答えがわかる.
https://onlinejudge.u-aizu.ac.jp/beta/review.html#RitsCamp19Day2/3943637
ACPC2018day1 H - 板
writer解説
各マスについて行える操作を横向き(側)か縦向き(側)のの板を置ける操作だと考える.
穴があるマスに横向き/縦向きの板を置くと1失う.グラフでは から各マスへ容量,各マスからへ容量の辺を張ることに相当する.
穴があるマスとが両方横向きならば1得る.同様に,穴があるマスとが両方縦向きならば1得る.これは頂点が両方赤/青のとき得る制約に相当し,グラフで表現できる.
グラフの最小カット - 無条件で得た分 が答えになる.
http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=3943257#1
CPSCO2019 Session2 F - Treasure Collector
マスに着目すると,横/縦に移動するロボットでコインを取るの2択に振り分ける問題だと考える.板 と同じように,マスにロボットを置くと1失い,横(縦)に隣接したマスが横(縦)につながってると1得ると考える.板 と違う点として ごとにコストがかかるのでロボットの初期位置との距離が で のとき以外,この1得る制約がかかる.
ロボットを置くと1失う部分については で固定である.それ以外については以下の制約を反映したグラフの最小カットが答えになる.
- 横(縦)に隣接したマスが横(縦)につながってると1得る
- 1つのマスを複数のロボットが踏むことを禁止
https://atcoder.jp/contests/cpsco2019-s2/submissions/8107311
RUPC2019day1 G - イルミネーション
- 装置をon → 周りの電球の の分スコアが変化
- 装置をoff → 変化なし
- 電球 を共有している装置 が両方on → 失う
最小カットを求めるグラフでの頂点番号を左上の装置から順番にとする.
装置のon, offについての辺のみを張ったグラフをサンプルでつくったグラフが下の画像の左のグラフになっている.電球を共有している装置の分の辺を張りたいが,「頂点 が両方赤のとき 失う」制約条件に該当するので基本的に難しい.
頂点 について,どちらも の辺をカットするときに対する制約であることが問題となる.そこで,一部の頂点について と の辺の容量を逆にすることで,「頂点 の色が異なるときに 失う」条件に帰着する.
この容量の交換は一般にできるわけではないが, をつないだグラフが二部グラフであれば可能で,今回の問題はグリッドグラフなので二部グラフである.
サンプルで容量を交換し,電球を共有している装置の分の辺を張ったグラフが下の画像の右になっている.
このグラフで最小カットを求めればよい.
https://onlinejudge.u-aizu.ac.jp/beta/review.html#RitsCamp19Day1/3943618
yukicoder No.119 旅行のツアーの問題
各国について2つの頂点を作成し,頂点頂点のようなグラフをつくる.各国について3辺が存在するので,これらが「行かない」「行くけど参加しない」「参加する」の3種類のどれかになるように割り当てる.
で「参加する」,で「行くけど参加しない」を選ぶのを禁止したいので失うとしたい.コスト のうち左下,右上が大きくなるようにできればグラフで表現できる.「行くけど参加しない」「行かない」「参加する」の順番で辺を割り当てることで, の右側頂点から の左側頂点に容量 の辺を張ればよい.
このグラフで最小カットを求めれば答えがわかる.
https://yukicoder.me/submissions/392293
KUPC2017 H - Make a Potion
燃やす埋めるかは微妙な気がするが, 番目の液体を何リットル使うか?に振り分ける + 依存関係が存在 なのでグラフの作り方の要領は同じ.
「 番目の液体を体積 以上使うなら 番目の液体を体積 以上使う」の制約がある場合, 番目の液体を のような中途半端な量を使うことが最適にはなりえない.使う量の候補は
- 番目を体積
- 番目を体積
- 番目を体積
- 番目を体積
となる. 番目を体積 使う場合に得る/失うコストに応じた辺 と 個の条件について禁止する(失う)に応じた辺 を張ったグラフで最小カットを求めればよい.
https://atcoder.jp/contests/kupc2017/submissions/8098901
3種類以上に振り分けるときのグラフの構築
の容量 の辺を切るのは,S-Tカットで が 側, が 側にあるときである.この辺はS-Tカットがこの状況ならば 失うという制約条件に対応する.
ある条件のとき 得るを表現したい場合は「無条件で 得る」「ある条件以外の場合 失う」とすると失う場合に帰着できる.
条件 のときに条件 を禁止する → 条件 を頂点 から終点 ,条件 を始点 から頂点 に対応させる.に容量 の辺を張る.この辺を張れるように選択肢を並べる.