ふろー
─水の低きに就くが如し
KMC 2nd drafear
1
• 最大流
• 最小費用流
• 応用
• 線形計画問題
2
ふろー
• 重み付き有向グラフ上で s から t まで
どのくらい流せるか
– 各辺の重みはその辺に流せる最大流量(容量)
– 最大流問題
– 下の場合最大流は 9
s
t
5
4
1
3
9
5
7
3
6
最大流
• Ford-Fulkerson法
– 𝑂 𝐹 𝐸
– 残余グラフ(後述)上で
増大道(sからtに1以上流せるパス)を見つけて
流し続ける
4
s
t
5
4
1
3
9
5
7
6
増大道 ─ に1を流す
flow = 0
最大流
• 残余グラフ
𝑒 = 𝑢, 𝑣 ∈ 𝐸 に 𝑓 流したら
逆辺 𝑒′
= 𝑣, 𝑢 の容量を 𝑓 増やす
5
s
t
4
4
0
2
9
5
7
51
1
1
1
最大流
flow = 1
• dfsで増大道を見つけて流す
6
s
t
4
4
2
9
5
7
5 flow = 11
1
1
1
最大流
• これを増大道がなくなるまで繰り返す
7
s
t
3
3
2
9
5
6
6 flow = 22
1
1
1
最大流
• なぜうまくいくか
– 逆辺に流す = 押し戻す
– s, t 以外の各頂点で
流量保存則(出る流量=入る流量)
が成り立っていれば良い
8
s
t
最大流
最大流
増大道がなくなったらそれが最大流
∵ sから残余グラフ上で到達可能な頂点集合
Sを考えると, S→V\T へ残余グラフ上で
辺がないから元のグラフではめいいっぱい
流れているのでこれ以上流せない
9
最大流
増大道は dfs すれば 𝑂 𝐸 で見つけられ,
1回流すと今まで合計で流した流量は
少なくとも1増えるので,
答えとなる流量を 𝐹 とすると 𝑂 𝐹 𝐸 .
10
最大流
• Ford-Fulkerson法は無駄が多そう
– 遠回りして見つけたパスを後から近いルート
で更新したりする
– 計算量が 𝐹 に依存する
s-t 間の距離が近い順に見ていく!
Dinicのアルゴリズム
11
最大流
• Dinicのアルゴリズム
– dfsする前にbfsして, sから遠ざかっていく辺
だけを辿っていく
– 𝑂 𝑉 2 𝐸 (よりもかなり高速)
12
flow = 0;
while (1) {
update = false;
bfsして各頂点のsからの距離を計算する;
while ((f = dfsして増大道を見つけて流した流量) > 0) {
flow += flow;
update = true;
}
if (!update) return flow;
}
最大流
• 容量スケーリング
– 2 𝑛 単位で流せるだけ流すといった操作を
𝑛 を減らしていきながら繰り返す
13
最小費用流
• 各辺に容量だけでなくコストの重みもある
• その辺に流量1のフローを流したときに
そのコストが発生する
• s – t 間に 流量 𝐹 のフローを流したときの
合計コストを最小化したい
14
最小費用流
• アルゴリズム
– コスト 𝑐 の辺の逆辺のコストを −𝑐 とする
– Ford-Fulkerson法の増大道を見つけるフェイズで
dfsする代わりに Bellman–Ford を行い,
s – t 最短経路を見つける
– それだけ!!
– 𝑂(𝐹 𝑉 𝐸 )
15
最小費用流
• Bellman-Ford の部分を dijkstraにしたい
• 逆辺のせいで負の辺が現れるので
dijkstra使えなさそう
– 実は使える
16
最小費用流
• 各頂点にポテンシャルを良い感じに
設定するとdijkstraできる
• ポテンシャルとはゲタ的なもので,
各頂点のポテンシャルを ℎ 𝑣 とし,
辺𝑒 = 𝑢, 𝑣 のコスト𝑑 𝑢𝑣を
𝑑 𝑢𝑣
′
= 𝑑 𝑢𝑣 + ℎ 𝑢 − ℎ 𝑣として考えたときに
残余グラフ上の全ての辺で
𝑑 𝑢𝑣
′
≥ 0 であればdijkstraが使える!
17
最小費用流
1. 各頂点のポテンシャルを ℎ 𝑣 とする
2. 初期状態では ℎ 𝑣 = 0 とする
3. 初期状態で負コストの辺がなければ,
dijkstraを1回まわせるので回してフローを流す
4. 回した結果, sからの距離を𝑑𝑖𝑠𝑡 𝑣とする
5. 全てのℎ 𝑣に𝑑𝑖𝑠𝑡 𝑣を加える
6. すると, なぜか残余グラフ上でコストが正になるので
3にもどって反復的にできる (詳しくは蟻本)
18
最小費用流
• dijkstraを使えば𝑂 𝐹 𝐸 log 𝑉
19
• 応用
– 通信速度
– 二部マッチング
– DAGの最小パス被覆
– 区間グラフ
– 最小カット
– 最小頂点被覆
– 最大安定集合(独立集合)
20
最大流・最小費用流
応用 – 通信速度
• 各回線の通信容量(速度)が与えられるので
s-t間の通信速度を最大化したい
21
s
t
応用 – 通信速度
• 各回線の通信容量が与えられるので
通信速度を最大化したい
– 無向グラフの場合は双方向に辺を張れば良い
22
cap
cap
cap
応用 – 通信速度
• 回線利用料がかかる場合は最小費用流
23
応用 – 二部マッチング
• ペアをたくさん作りたい
– 人に仕事を割り当てるなど
– 複数の人と結婚できない
24
ペアになれるもの
応用 – 二部マッチング
• ペアをたくさん作りたい
– 以下のグラフで最大流を求めれば良い
25
s
t
全て容量 1
応用 – 二部マッチング
• ペアを作るのに異なるコストがかかる
場合は最小費用流
26
応用 – DAGの最小パス被覆
• グラフをいくつかの独立したパスで
被覆したい
• パス数を最小化したい
27
1
3
4
5
2
応用 – DAGの最小パス被覆
• 二部マッチングに帰着できる
自分の次の頂点をどれにするか
(頂点数) – (最大流) が答え
28
1
3
4
5
2
s t
1
2
3
4
5
1
2
3
4
5
応用 – 区間グラフ
• 重み付きの区間 𝑙, 𝑟 , 𝑙, 𝑟 ∈ 𝑍 がいくつかあり,
重なる区間がK以下になるように区間を選び
重みの和を最大化したい
– 0 → 6 に最小費用流を流量Kだけ流す
29
0 6431 2 5
∞, 0 ∞, 0 ∞, 0 ∞, 0 ∞, 0 ∞, 0
1,-4
1,-9 1,-2
1,-3
cap, cost
応用 – 区間グラフ
• 最小費用流において, 初期状態で
負の辺がある場合
– 初回のみBellman-Fordしてポテンシャル計算
• 負の閉路がある場合
– 検出して予め目一杯流す
30
応用 – 最小カット
• 問題
– 始点𝑠, 終点𝑡がある
– 𝑠 ∈ 𝑆, 𝑡 ∉ 𝑆なる頂点集合𝑆を求める
– 以下を最小化したい
𝑢,𝑣,𝑐𝑜𝑠𝑡 ∈𝐸,𝑢∈𝑆,𝑣∉𝑆
𝑐𝑜𝑠𝑡
31
https://sites.google.com/site/beiwangludememo/sh
u-xue/gurafu-li-lun/zui-dafuro-zui-xiaokatto-ding-li
応用 – 最小カット
• 問題
– 別の言い方をすれば
𝑠 − 𝑡パスが存在しなくなるように
いくつか辺をカットする
– カットするのにそのコストがかかる
32
https://sites.google.com/site/beiwangludememo/sh
u-xue/gurafu-li-lun/zui-dafuro-zui-xiaokatto-ding-li
最大流・最小カット定理
33
• 最大流 = 最小カット
– 最大流 → 最小カット と変換することも
最小カット → 最大流 と変換することもある
最大流・最小カット定理
34
• 証明
– 双対問題だから.
最大流・最小カット定理
35
• 証明2 (理解しておくと最小カットの場所もわかる)
– 最大流を流した残余グラフにおいて,
sから到達可能な頂点集合を𝑆とし,
𝑇 = 𝑉\Sとすると, 𝑠 ∈ 𝑆, 𝑡 ∈ 𝑇.
– 𝑆 → 𝑇の辺にはめいいっぱい流れていて
𝑇 → 𝑆の辺には全く流れていない.
最大流・最小カット定理
36
• 証明2
– これは1つのカットだから
最小カット ≤ 最大流
TS
最大流 = 辺の合計容量 = カット(のサイズ)
最大流・最小カット定理
37
• 証明2
– 最小カット < 最大流 なるカット𝑆′が
存在したとすると矛盾
T'S'
最大流 ≤ 辺の合計容量 = 最小カット
応用 – 最小頂点被覆
• 問題
– 無向グラフが与えられる
– 頂点集合𝑆を求める
– 全ての辺 𝑢, 𝑣 について
𝑢 ∈ 𝑆 または 𝑣 ∈ 𝑆 でなければならない
– 𝑆 のサイズを最小化したい
38
応用 – 最小頂点被覆
• 一般グラフの場合
最小頂点被覆の頂点数 ≥ 最大マッチングのサイズ
• 証明
– 最大マッチングの各辺に接続する頂点の一方は
少なくとも被覆されていなければならない
– ≠ な例 (最小頂点被覆2, 最大マッチング1)
39
1
32
応用 – 最小頂点被覆
• 二部グラフの場合
最小頂点被覆の頂点数 = 最大マッチングのサイズ
• 証明
– 最小カットに帰着できる
40
全てコスト1
s
t
応用 – 最小頂点被覆
• 証明
– 最小カットに帰着できる ・・・ なぜか
– 最小カットが求まったとする
– 下の例では赤い辺を3つ切るのが最小カット
41 全てコスト1
s
t
応用 – 最小頂点被覆
• 証明
– カットされる辺が 𝑠 か 𝑡 に接続していると仮定する
– 接続する 𝑠, 𝑡 でないもう一方の頂点を選ぶと
頂点被覆になっている
42
s
t
応用 – 最小頂点被覆
• 証明
– なぜか
– B – D 間に枝がないことを示せばよい
– あったとすると, カットではない
– つまりこれは頂点被覆になっている
43
A
B
B
C
D
D
s
t
A
応用 – 最小頂点被覆
• 証明
– 仮定「カットされる辺が 𝑠 か 𝑡 に接続している」
について
– 最小カットで真ん中の辺 𝑢, 𝑣 がカットされた場合
代わりに 𝑠, 𝑢 または 𝑣, 𝑡 をカットしても良い
– よって 最小頂点被覆 ≤ 最小カット
44
us tv
応用 – 最小頂点被覆
• 証明
– 逆も同様
– 最小頂点被覆が見つかったらそれと𝑠または𝑡との間の
辺を切ればカットになっている
– なぜならB – D間に辺がないはずだから
– よって 最小頂点被覆 ≥ 最小カット
45
A
B
B
C
D
D
s
t
A
応用 – 最大安定集合(独立集合)
• 安定集合(独立集合)
– どの2点間にも辺がない頂点集合
• 最大独立集合(安定集合) は
最小頂点被覆 の補集合
46
線形計画問題
min 𝑐 𝑇
𝑥
𝑠. 𝑡. 𝐴𝑥 ≤ 𝑏
47
min
4
−2
10
𝑇 𝑥1
𝑥2
𝑥3
𝑠. 𝑡.
1 6 8
4 2 5
𝑥1
𝑥2
𝑥3
≤
3
5
例
• 主問題の最適解 = 双対問題の最適解
線形計画問題
max 𝑐 𝑇
𝑥
𝑠. 𝑡. 𝐴𝑥 ≤ 𝑏, 𝑥 ≥ 0
48
min 𝑏 𝑇
𝑦
𝑠. 𝑡. 𝐴 𝑇
𝑦 ≥ 𝑐, 𝑦 ≥ 0
線形計画問題
• 最短経路問題
49
min
10
3
5
𝑇 𝑥1
𝑥2
𝑥3
𝑠. 𝑡.
−1 −1 0
0 1 −1
1 0 1
𝑥1
𝑥2
𝑥3
≥
−1
0
1
, 𝑥𝑖 ≥ 0
t
s
3
5
10
𝑥1
𝑥2
𝑥3
線形計画問題
• 最短経路問題 (双対)
50
t
s
v3
5
10
𝑥1
𝑥2
𝑥3
max
−1
0
1
𝑇 𝑝𝑠
𝑝 𝑣
𝑝𝑡
𝑠. 𝑡.
−1 0 1
−1 1 0
0 −1 1
𝑝𝑠
𝑝 𝑣
𝑝𝑡
≤
10
3
5
線形計画問題
• 最短経路問題 (双対)
– 決定変数 𝑝 𝑣 𝑣 ∈ 𝑉 をポテンシャルという
– 1つは適当に決めて良いので 𝑝𝑠 = 0 とする
51
𝑝𝑡 − 𝑝𝑠
𝑝 𝑣 − 𝑝 𝑢 ≤ 𝑑 𝑒 𝑓𝑜𝑟 𝑎𝑙𝑙 𝑒 = 𝑢, 𝑣 ∈ 𝐸
𝑚𝑎𝑥
𝑠. 𝑡.
線形計画問題
• つまり, 差分制約の最大化問題は
双対をとれば最短経路問題になる!
• もちろん逆もできる
52
線形計画問題
• 同様にして, 最大流問題の双対問題が
最小カット問題であることもわかる
53

KMC 競技プログラミング練習会 Advanced 第3回 ふろー