Submit Search
Upload
KMC 競技プログラミング練習会 Advanced 第3回 ふろー
•
3 likes
•
2,354 views
kyoto university
Follow
KMCの競技プログラミング練習会Advanced第3回を担当いたしました。 去年Normalでフローを行わなかったので, 基本からやっていきます.
Read less
Read more
Engineering
Report
Share
Report
Share
1 of 53
Download now
Download to read offline
Recommended
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
Kensuke Otsuki
指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端
Yoichi Iwata
Trianguler
Trianguler
Ken Ogura
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く
shindannin
2SAT(充足可能性問題)の解き方
2SAT(充足可能性問題)の解き方
Tsuneo Yoshioka
abc032
abc032
AtCoder Inc.
様々な全域木問題
様々な全域木問題
tmaehara
AtCoder Regular Contest 024 解説
AtCoder Regular Contest 024 解説
AtCoder Inc.
Recommended
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
Kensuke Otsuki
指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端
Yoichi Iwata
Trianguler
Trianguler
Ken Ogura
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く
shindannin
2SAT(充足可能性問題)の解き方
2SAT(充足可能性問題)の解き方
Tsuneo Yoshioka
abc032
abc032
AtCoder Inc.
様々な全域木問題
様々な全域木問題
tmaehara
AtCoder Regular Contest 024 解説
AtCoder Regular Contest 024 解説
AtCoder Inc.
AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説
AtCoder Inc.
指数時間アルゴリズム入門
指数時間アルゴリズム入門
Yoichi Iwata
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズム
Takuya Akiba
AtCoder Regular Contest 029 解説
AtCoder Regular Contest 029 解説
AtCoder Inc.
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
Takuya Akiba
AtCoder Regular Contest 019 解説
AtCoder Regular Contest 019 解説
AtCoder Inc.
双対性
双対性
Yoichi Iwata
Re永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライド
Masaki Hara
DDPC 2016 予選 解説
DDPC 2016 予選 解説
AtCoder Inc.
Union find(素集合データ構造)
Union find(素集合データ構造)
AtCoder Inc.
Binary indexed tree
Binary indexed tree
HCPC: 北海道大学競技プログラミングサークル
文字列アルゴリズム
文字列アルゴリズム
HCPC: 北海道大学競技プログラミングサークル
ACPC 2018 Day3 G: 回文部分列 (Palindromic Subsequences)
ACPC 2018 Day3 G: 回文部分列 (Palindromic Subsequences)
HCPC: 北海道大学競技プログラミングサークル
AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説
AtCoder Inc.
動的計画法を極める!
動的計画法を極める!
HCPC: 北海道大学競技プログラミングサークル
色々なダイクストラ高速化
色々なダイクストラ高速化
yosupo
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造
Takuya Akiba
Rolling Hashを殺す話
Rolling Hashを殺す話
Nagisa Eto
AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説
AtCoder Inc.
AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説
AtCoder Inc.
ネットワークフロー
ネットワークフロー
Kohei Shinohara
グラフネットワーク〜フロー&カット〜
グラフネットワーク〜フロー&カット〜
HCPC: 北海道大学競技プログラミングサークル
More Related Content
What's hot
AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説
AtCoder Inc.
指数時間アルゴリズム入門
指数時間アルゴリズム入門
Yoichi Iwata
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズム
Takuya Akiba
AtCoder Regular Contest 029 解説
AtCoder Regular Contest 029 解説
AtCoder Inc.
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
Takuya Akiba
AtCoder Regular Contest 019 解説
AtCoder Regular Contest 019 解説
AtCoder Inc.
双対性
双対性
Yoichi Iwata
Re永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライド
Masaki Hara
DDPC 2016 予選 解説
DDPC 2016 予選 解説
AtCoder Inc.
Union find(素集合データ構造)
Union find(素集合データ構造)
AtCoder Inc.
Binary indexed tree
Binary indexed tree
HCPC: 北海道大学競技プログラミングサークル
文字列アルゴリズム
文字列アルゴリズム
HCPC: 北海道大学競技プログラミングサークル
ACPC 2018 Day3 G: 回文部分列 (Palindromic Subsequences)
ACPC 2018 Day3 G: 回文部分列 (Palindromic Subsequences)
HCPC: 北海道大学競技プログラミングサークル
AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説
AtCoder Inc.
動的計画法を極める!
動的計画法を極める!
HCPC: 北海道大学競技プログラミングサークル
色々なダイクストラ高速化
色々なダイクストラ高速化
yosupo
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造
Takuya Akiba
Rolling Hashを殺す話
Rolling Hashを殺す話
Nagisa Eto
AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説
AtCoder Inc.
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 029 解説
AtCoder Regular Contest 029 解説
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
AtCoder Regular Contest 019 解説
AtCoder Regular Contest 019 解説
双対性
双対性
Re永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライド
DDPC 2016 予選 解説
DDPC 2016 予選 解説
Union find(素集合データ構造)
Union find(素集合データ構造)
Binary indexed tree
Binary indexed tree
文字列アルゴリズム
文字列アルゴリズム
ACPC 2018 Day3 G: 回文部分列 (Palindromic Subsequences)
ACPC 2018 Day3 G: 回文部分列 (Palindromic Subsequences)
AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説
動的計画法を極める!
動的計画法を極める!
色々なダイクストラ高速化
色々なダイクストラ高速化
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造
Rolling Hashを殺す話
Rolling Hashを殺す話
AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説
AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説
Viewers also liked
ネットワークフロー
ネットワークフロー
Kohei Shinohara
グラフネットワーク〜フロー&カット〜
グラフネットワーク〜フロー&カット〜
HCPC: 北海道大学競技プログラミングサークル
MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説
AtCoder Inc.
グラフと木
グラフと木
京大 マイコンクラブ
辺彩色
辺彩色
Ken Ogura
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...
steve dalton
En atbantibiotics
En atbantibiotics
Dr P Deepak
Normas internacionales de ecologia
Normas internacionales de ecologia
itzyavila
Cat accessories.
Cat accessories.
Unikorns
Huisvesting in control (wiljan jansen en hanneke kohlmann)
Huisvesting in control (wiljan jansen en hanneke kohlmann)
Bart Vogels
«Добрая точка»
«Добрая точка»
nfnfrz
Reference interviews
Reference interviews
Yongtao Lin
Ap mar scene_v2
Ap mar scene_v2
CalumetPress
Bagaimana menambah-pengguna-baru
Bagaimana menambah-pengguna-baru
GHAZALEE AHMAD
NEWLUG May 2010 Presentation - Android
NEWLUG May 2010 Presentation - Android
NEWLUG
Viewers also liked
(16)
ネットワークフロー
ネットワークフロー
グラフネットワーク〜フロー&カット〜
グラフネットワーク〜フロー&カット〜
MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説
グラフと木
グラフと木
辺彩色
辺彩色
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...
En atbantibiotics
En atbantibiotics
Normas internacionales de ecologia
Normas internacionales de ecologia
Cat accessories.
Cat accessories.
Huisvesting in control (wiljan jansen en hanneke kohlmann)
Huisvesting in control (wiljan jansen en hanneke kohlmann)
«Добрая точка»
«Добрая точка»
Reference interviews
Reference interviews
Ap mar scene_v2
Ap mar scene_v2
Bagaimana menambah-pengguna-baru
Bagaimana menambah-pengguna-baru
NEWLUG May 2010 Presentation - Android
NEWLUG May 2010 Presentation - Android
KMC 競技プログラミング練習会 Advanced 第3回 ふろー
1.
ふろー ─水の低きに就くが如し KMC 2nd drafear 1
2.
• 最大流 • 最小費用流 •
応用 • 線形計画問題 2 ふろー
3.
• 重み付き有向グラフ上で s
から t まで どのくらい流せるか – 各辺の重みはその辺に流せる最大流量(容量) – 最大流問題 – 下の場合最大流は 9 s t 5 4 1 3 9 5 7 3 6 最大流
4.
• Ford-Fulkerson法 – 𝑂
𝐹 𝐸 – 残余グラフ(後述)上で 増大道(sからtに1以上流せるパス)を見つけて 流し続ける 4 s t 5 4 1 3 9 5 7 6 増大道 ─ に1を流す flow = 0 最大流
5.
• 残余グラフ 𝑒 =
𝑢, 𝑣 ∈ 𝐸 に 𝑓 流したら 逆辺 𝑒′ = 𝑣, 𝑢 の容量を 𝑓 増やす 5 s t 4 4 0 2 9 5 7 51 1 1 1 最大流 flow = 1
6.
• dfsで増大道を見つけて流す 6 s t 4 4 2 9 5 7 5 flow
= 11 1 1 1 最大流
7.
• これを増大道がなくなるまで繰り返す 7 s t 3 3 2 9 5 6 6 flow
= 22 1 1 1 最大流
8.
• なぜうまくいくか – 逆辺に流す
= 押し戻す – s, t 以外の各頂点で 流量保存則(出る流量=入る流量) が成り立っていれば良い 8 s t 最大流
9.
最大流 増大道がなくなったらそれが最大流 ∵ sから残余グラフ上で到達可能な頂点集合 Sを考えると, S→V\T
へ残余グラフ上で 辺がないから元のグラフではめいいっぱい 流れているのでこれ以上流せない 9
10.
最大流 増大道は dfs すれば
𝑂 𝐸 で見つけられ, 1回流すと今まで合計で流した流量は 少なくとも1増えるので, 答えとなる流量を 𝐹 とすると 𝑂 𝐹 𝐸 . 10
11.
最大流 • Ford-Fulkerson法は無駄が多そう – 遠回りして見つけたパスを後から近いルート で更新したりする –
計算量が 𝐹 に依存する s-t 間の距離が近い順に見ていく! Dinicのアルゴリズム 11
12.
最大流 • 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; }
13.
最大流 • 容量スケーリング – 2
𝑛 単位で流せるだけ流すといった操作を 𝑛 を減らしていきながら繰り返す 13
14.
最小費用流 • 各辺に容量だけでなくコストの重みもある • その辺に流量1のフローを流したときに そのコストが発生する •
s – t 間に 流量 𝐹 のフローを流したときの 合計コストを最小化したい 14
15.
最小費用流 • アルゴリズム – コスト
𝑐 の辺の逆辺のコストを −𝑐 とする – Ford-Fulkerson法の増大道を見つけるフェイズで dfsする代わりに Bellman–Ford を行い, s – t 最短経路を見つける – それだけ!! – 𝑂(𝐹 𝑉 𝐸 ) 15
16.
最小費用流 • Bellman-Ford の部分を
dijkstraにしたい • 逆辺のせいで負の辺が現れるので dijkstra使えなさそう – 実は使える 16
17.
最小費用流 • 各頂点にポテンシャルを良い感じに 設定するとdijkstraできる • ポテンシャルとはゲタ的なもので, 各頂点のポテンシャルを
ℎ 𝑣 とし, 辺𝑒 = 𝑢, 𝑣 のコスト𝑑 𝑢𝑣を 𝑑 𝑢𝑣 ′ = 𝑑 𝑢𝑣 + ℎ 𝑢 − ℎ 𝑣として考えたときに 残余グラフ上の全ての辺で 𝑑 𝑢𝑣 ′ ≥ 0 であればdijkstraが使える! 17
18.
最小費用流 1. 各頂点のポテンシャルを ℎ
𝑣 とする 2. 初期状態では ℎ 𝑣 = 0 とする 3. 初期状態で負コストの辺がなければ, dijkstraを1回まわせるので回してフローを流す 4. 回した結果, sからの距離を𝑑𝑖𝑠𝑡 𝑣とする 5. 全てのℎ 𝑣に𝑑𝑖𝑠𝑡 𝑣を加える 6. すると, なぜか残余グラフ上でコストが正になるので 3にもどって反復的にできる (詳しくは蟻本) 18
19.
最小費用流 • dijkstraを使えば𝑂 𝐹
𝐸 log 𝑉 19
20.
• 応用 – 通信速度 –
二部マッチング – DAGの最小パス被覆 – 区間グラフ – 最小カット – 最小頂点被覆 – 最大安定集合(独立集合) 20 最大流・最小費用流
21.
応用 – 通信速度 •
各回線の通信容量(速度)が与えられるので s-t間の通信速度を最大化したい 21 s t
22.
応用 – 通信速度 •
各回線の通信容量が与えられるので 通信速度を最大化したい – 無向グラフの場合は双方向に辺を張れば良い 22 cap cap cap
23.
応用 – 通信速度 •
回線利用料がかかる場合は最小費用流 23
24.
応用 – 二部マッチング •
ペアをたくさん作りたい – 人に仕事を割り当てるなど – 複数の人と結婚できない 24 ペアになれるもの
25.
応用 – 二部マッチング •
ペアをたくさん作りたい – 以下のグラフで最大流を求めれば良い 25 s t 全て容量 1
26.
応用 – 二部マッチング •
ペアを作るのに異なるコストがかかる 場合は最小費用流 26
27.
応用 – DAGの最小パス被覆 •
グラフをいくつかの独立したパスで 被覆したい • パス数を最小化したい 27 1 3 4 5 2
28.
応用 – DAGの最小パス被覆 •
二部マッチングに帰着できる 自分の次の頂点をどれにするか (頂点数) – (最大流) が答え 28 1 3 4 5 2 s t 1 2 3 4 5 1 2 3 4 5
29.
応用 – 区間グラフ •
重み付きの区間 𝑙, 𝑟 , 𝑙, 𝑟 ∈ 𝑍 がいくつかあり, 重なる区間が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
30.
応用 – 区間グラフ •
最小費用流において, 初期状態で 負の辺がある場合 – 初回のみBellman-Fordしてポテンシャル計算 • 負の閉路がある場合 – 検出して予め目一杯流す 30
31.
応用 – 最小カット •
問題 – 始点𝑠, 終点𝑡がある – 𝑠 ∈ 𝑆, 𝑡 ∉ 𝑆なる頂点集合𝑆を求める – 以下を最小化したい 𝑢,𝑣,𝑐𝑜𝑠𝑡 ∈𝐸,𝑢∈𝑆,𝑣∉𝑆 𝑐𝑜𝑠𝑡 31 https://sites.google.com/site/beiwangludememo/sh u-xue/gurafu-li-lun/zui-dafuro-zui-xiaokatto-ding-li
32.
応用 – 最小カット •
問題 – 別の言い方をすれば 𝑠 − 𝑡パスが存在しなくなるように いくつか辺をカットする – カットするのにそのコストがかかる 32 https://sites.google.com/site/beiwangludememo/sh u-xue/gurafu-li-lun/zui-dafuro-zui-xiaokatto-ding-li
33.
最大流・最小カット定理 33 • 最大流 =
最小カット – 最大流 → 最小カット と変換することも 最小カット → 最大流 と変換することもある
34.
最大流・最小カット定理 34 • 証明 – 双対問題だから.
35.
最大流・最小カット定理 35 • 証明2 (理解しておくと最小カットの場所もわかる) –
最大流を流した残余グラフにおいて, sから到達可能な頂点集合を𝑆とし, 𝑇 = 𝑉\Sとすると, 𝑠 ∈ 𝑆, 𝑡 ∈ 𝑇. – 𝑆 → 𝑇の辺にはめいいっぱい流れていて 𝑇 → 𝑆の辺には全く流れていない.
36.
最大流・最小カット定理 36 • 証明2 – これは1つのカットだから 最小カット
≤ 最大流 TS 最大流 = 辺の合計容量 = カット(のサイズ)
37.
最大流・最小カット定理 37 • 証明2 – 最小カット
< 最大流 なるカット𝑆′が 存在したとすると矛盾 T'S' 最大流 ≤ 辺の合計容量 = 最小カット
38.
応用 – 最小頂点被覆 •
問題 – 無向グラフが与えられる – 頂点集合𝑆を求める – 全ての辺 𝑢, 𝑣 について 𝑢 ∈ 𝑆 または 𝑣 ∈ 𝑆 でなければならない – 𝑆 のサイズを最小化したい 38
39.
応用 – 最小頂点被覆 •
一般グラフの場合 最小頂点被覆の頂点数 ≥ 最大マッチングのサイズ • 証明 – 最大マッチングの各辺に接続する頂点の一方は 少なくとも被覆されていなければならない – ≠ な例 (最小頂点被覆2, 最大マッチング1) 39 1 32
40.
応用 – 最小頂点被覆 •
二部グラフの場合 最小頂点被覆の頂点数 = 最大マッチングのサイズ • 証明 – 最小カットに帰着できる 40 全てコスト1 s t
41.
応用 – 最小頂点被覆 •
証明 – 最小カットに帰着できる ・・・ なぜか – 最小カットが求まったとする – 下の例では赤い辺を3つ切るのが最小カット 41 全てコスト1 s t
42.
応用 – 最小頂点被覆 •
証明 – カットされる辺が 𝑠 か 𝑡 に接続していると仮定する – 接続する 𝑠, 𝑡 でないもう一方の頂点を選ぶと 頂点被覆になっている 42 s t
43.
応用 – 最小頂点被覆 •
証明 – なぜか – B – D 間に枝がないことを示せばよい – あったとすると, カットではない – つまりこれは頂点被覆になっている 43 A B B C D D s t A
44.
応用 – 最小頂点被覆 •
証明 – 仮定「カットされる辺が 𝑠 か 𝑡 に接続している」 について – 最小カットで真ん中の辺 𝑢, 𝑣 がカットされた場合 代わりに 𝑠, 𝑢 または 𝑣, 𝑡 をカットしても良い – よって 最小頂点被覆 ≤ 最小カット 44 us tv
45.
応用 – 最小頂点被覆 •
証明 – 逆も同様 – 最小頂点被覆が見つかったらそれと𝑠または𝑡との間の 辺を切ればカットになっている – なぜならB – D間に辺がないはずだから – よって 最小頂点被覆 ≥ 最小カット 45 A B B C D D s t A
46.
応用 – 最大安定集合(独立集合) •
安定集合(独立集合) – どの2点間にも辺がない頂点集合 • 最大独立集合(安定集合) は 最小頂点被覆 の補集合 46
47.
線形計画問題 min 𝑐 𝑇 𝑥 𝑠.
𝑡. 𝐴𝑥 ≤ 𝑏 47 min 4 −2 10 𝑇 𝑥1 𝑥2 𝑥3 𝑠. 𝑡. 1 6 8 4 2 5 𝑥1 𝑥2 𝑥3 ≤ 3 5 例
48.
• 主問題の最適解 =
双対問題の最適解 線形計画問題 max 𝑐 𝑇 𝑥 𝑠. 𝑡. 𝐴𝑥 ≤ 𝑏, 𝑥 ≥ 0 48 min 𝑏 𝑇 𝑦 𝑠. 𝑡. 𝐴 𝑇 𝑦 ≥ 𝑐, 𝑦 ≥ 0
49.
線形計画問題 • 最短経路問題 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.
線形計画問題 • 最短経路問題 (双対) 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
51.
線形計画問題 • 最短経路問題 (双対) –
決定変数 𝑝 𝑣 𝑣 ∈ 𝑉 をポテンシャルという – 1つは適当に決めて良いので 𝑝𝑠 = 0 とする 51 𝑝𝑡 − 𝑝𝑠 𝑝 𝑣 − 𝑝 𝑢 ≤ 𝑑 𝑒 𝑓𝑜𝑟 𝑎𝑙𝑙 𝑒 = 𝑢, 𝑣 ∈ 𝐸 𝑚𝑎𝑥 𝑠. 𝑡.
52.
線形計画問題 • つまり, 差分制約の最大化問題は 双対をとれば最短経路問題になる! •
もちろん逆もできる 52
53.
線形計画問題 • 同様にして, 最大流問題の双対問題が 最小カット問題であることもわかる 53
Download now