SlideShare a Scribd company logo
1 of 53
Download to read offline
ふろー
─水の低きに就くが如し
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

More Related Content

What's hot

AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Inc.
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門Yoichi Iwata
 
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムTakuya Akiba
 
AtCoder Regular Contest 029 解説
AtCoder Regular Contest 029 解説AtCoder Regular Contest 029 解説
AtCoder Regular Contest 029 解説AtCoder Inc.
 
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~Takuya Akiba
 
AtCoder Regular Contest 019 解説
AtCoder Regular Contest 019 解説AtCoder Regular Contest 019 解説
AtCoder Regular Contest 019 解説AtCoder Inc.
 
Re永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドRe永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドMasaki Hara
 
DDPC 2016 予選 解説
DDPC 2016 予選 解説DDPC 2016 予選 解説
DDPC 2016 予選 解説AtCoder Inc.
 
Union find(素集合データ構造)
Union find(素集合データ構造)Union find(素集合データ構造)
Union find(素集合データ構造)AtCoder Inc.
 
AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説AtCoder Inc.
 
色々なダイクストラ高速化
色々なダイクストラ高速化色々なダイクストラ高速化
色々なダイクストラ高速化yosupo
 
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造Takuya Akiba
 
Rolling Hashを殺す話
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話Nagisa Eto
 
AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説AtCoder Inc.
 
AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Inc.
 

What's hot (20)

AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門
 
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズム
 
AtCoder Regular Contest 029 解説
AtCoder Regular Contest 029 解説AtCoder Regular Contest 029 解説
AtCoder Regular Contest 029 解説
 
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
 
AtCoder Regular Contest 019 解説
AtCoder Regular Contest 019 解説AtCoder Regular Contest 019 解説
AtCoder Regular Contest 019 解説
 
双対性
双対性双対性
双対性
 
Re永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドRe永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライド
 
DDPC 2016 予選 解説
DDPC 2016 予選 解説DDPC 2016 予選 解説
DDPC 2016 予選 解説
 
Union find(素集合データ構造)
Union find(素集合データ構造)Union find(素集合データ構造)
Union find(素集合データ構造)
 
Binary indexed tree
Binary indexed treeBinary indexed tree
Binary indexed tree
 
文字列アルゴリズム
文字列アルゴリズム文字列アルゴリズム
文字列アルゴリズム
 
ACPC 2018 Day3 G: 回文部分列 (Palindromic Subsequences)
ACPC 2018 Day3 G: 回文部分列 (Palindromic Subsequences)ACPC 2018 Day3 G: 回文部分列 (Palindromic Subsequences)
ACPC 2018 Day3 G: 回文部分列 (Palindromic Subsequences)
 
AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説
 
動的計画法を極める!
動的計画法を極める!動的計画法を極める!
動的計画法を極める!
 
色々なダイクストラ高速化
色々なダイクストラ高速化色々なダイクストラ高速化
色々なダイクストラ高速化
 
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造
 
Rolling Hashを殺す話
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話
 
AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説
 
AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説
 

Viewers also liked

ネットワークフロー
ネットワークフローネットワークフロー
ネットワークフローKohei Shinohara
 
MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説AtCoder Inc.
 
AtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組みAtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組みAtCoder Inc.
 
Beyond the Boardroom - Energizing Your People to Achieve Good Things: Team Bu...
Beyond the Boardroom - Energizing Your People to Achieve Good Things: Team Bu...Beyond the Boardroom - Energizing Your People to Achieve Good Things: Team Bu...
Beyond the Boardroom - Energizing Your People to Achieve Good Things: Team Bu...steve dalton
 
En atbantibiotics
En atbantibioticsEn atbantibiotics
En atbantibioticsDr P Deepak
 
Normas internacionales de ecologia
Normas internacionales de ecologiaNormas internacionales de ecologia
Normas internacionales de ecologiaitzyavila
 
Cat accessories.
Cat accessories.Cat accessories.
Cat accessories.Unikorns
 
Huisvesting in control (wiljan jansen en hanneke kohlmann)
Huisvesting in control (wiljan jansen en hanneke kohlmann)Huisvesting in control (wiljan jansen en hanneke kohlmann)
Huisvesting in control (wiljan jansen en hanneke kohlmann)Bart Vogels
 
«Добрая точка»
«Добрая точка»«Добрая точка»
«Добрая точка»nfnfrz
 
Reference interviews
Reference interviewsReference interviews
Reference interviewsYongtao Lin
 
Bagaimana menambah-pengguna-baru
Bagaimana menambah-pengguna-baruBagaimana menambah-pengguna-baru
Bagaimana menambah-pengguna-baruGHAZALEE AHMAD
 
NEWLUG May 2010 Presentation - Android
NEWLUG May 2010 Presentation - AndroidNEWLUG May 2010 Presentation - Android
NEWLUG May 2010 Presentation - AndroidNEWLUG
 

Viewers also liked (16)

ネットワークフロー
ネットワークフローネットワークフロー
ネットワークフロー
 
グラフネットワーク〜フロー&カット〜
グラフネットワーク〜フロー&カット〜グラフネットワーク〜フロー&カット〜
グラフネットワーク〜フロー&カット〜
 
MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説
 
グラフと木
グラフと木グラフと木
グラフと木
 
辺彩色
辺彩色辺彩色
辺彩色
 
AtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組みAtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組み
 
Beyond the Boardroom - Energizing Your People to Achieve Good Things: Team Bu...
Beyond the Boardroom - Energizing Your People to Achieve Good Things: Team Bu...Beyond the Boardroom - Energizing Your People to Achieve Good Things: Team Bu...
Beyond the Boardroom - Energizing Your People to Achieve Good Things: Team Bu...
 
En atbantibiotics
En atbantibioticsEn atbantibiotics
En atbantibiotics
 
Normas internacionales de ecologia
Normas internacionales de ecologiaNormas internacionales de ecologia
Normas internacionales de ecologia
 
Cat accessories.
Cat accessories.Cat accessories.
Cat accessories.
 
Huisvesting in control (wiljan jansen en hanneke kohlmann)
Huisvesting in control (wiljan jansen en hanneke kohlmann)Huisvesting in control (wiljan jansen en hanneke kohlmann)
Huisvesting in control (wiljan jansen en hanneke kohlmann)
 
«Добрая точка»
«Добрая точка»«Добрая точка»
«Добрая точка»
 
Reference interviews
Reference interviewsReference interviews
Reference interviews
 
Ap mar scene_v2
Ap mar scene_v2Ap mar scene_v2
Ap mar scene_v2
 
Bagaimana menambah-pengguna-baru
Bagaimana menambah-pengguna-baruBagaimana menambah-pengguna-baru
Bagaimana menambah-pengguna-baru
 
NEWLUG May 2010 Presentation - Android
NEWLUG May 2010 Presentation - AndroidNEWLUG May 2010 Presentation - Android
NEWLUG May 2010 Presentation - Android
 

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