SlideShare a Scribd company logo
1 of 53
Download to read offline
最大マッチング

アルゴリズム
北海道大学 情報理工学博士2年 情報知識ネットワーク研究室
栗田 和宏
通称,黄色本

B.コルテ,J.フィーゲン (著),浅野孝夫,浅野泰仁,小野孝男,
平田富夫 (訳),『組合せ最適化 第 2 版』,丸善出版,2012 年.
一般グラフの最大マッチング,yosupoさん作のスライド
今回の内容はかなり難しいです!!!
途中でどんどん質問してください.
!2
参考資料
今回扱う問題: グラフGが与えられるので,G中の
要素数最大のマッチングを求めよ.
マッチングM: どんな2辺e, f ∈ Mも同じ端点を持た
ない辺集合
今回の発表内容(最大マッチング)
!3
競プロでは,グラフが二部グラフに制約された問題
をよく見る.
現実問題でも二部グラフのマッチング問題はよく出
るらしい.(drken マッチングで検索)
二部グラフの最大マッチングはフローを使って求め
られるが,それは割愛します.(ちょっとだけ今回
の話とも関係あり)
よくあるマッチング系の問題
!4
最大マッチングアルゴリズム
の概要
!5
性質1: マッチングMが最大である GはM-増加

パスPを持たない.
M-交互パス: Mに対して,パスPの辺が,Mに含まれる場合とそう
でない場合が交互になるパス.
M-増加パス: 両端点がMにカバーされないM-交互パス
Mがvを端点に持つ辺を持つ時,Mはvをカバーするといい,そう
でない場合,Mはvをカバーしないという.
マッチングに関する性質
!6
マッチングに関する性質
!7
性質1: マッチングMが最大である GはM-増加

パスPを持たない.
M-交互パス: Mに対して,パスPの辺が,Mに含まれる場合とそう
でない場合が交互になるパス.
M-増加パス: 両端点がMにカバーされないM-交互パス
Mがvを端点に持つ辺を持つ時,Mはvをカバーするといい,そう
でない場合,Mはvをカバーしないという.
マッチングに関する性質
!8
性質1: マッチングMが最大である GはM-増加

パスPを持たない.
M-交互パス: Mに対して,パスPの辺が,Mに含まれる場合とそう
でない場合が交互になるパス.
M-増加パス: 両端点がMにカバーされないM-交互パス
Mがvを端点に持つ辺を持つ時,Mはvをカバーするといい,そう
でない場合,Mはvをカバーしないという.
性質1の証明(A → B)
!9
性質1: マッチングMが最大である GはM-増加パスPを持たない.
GはM-増加パスPを持つならばマッチングMは最大
でないを示す(対偶).
PはM-増加パスなので,M△Pはマッチングであ
り,Mより多くの辺を持つ.
- 2つの集合AとBに対して,A△B = A ∪ B  (A ∩ B)とする.
性質1の証明(A → B)
!10
性質1: マッチングMが最大である GはM-増加パスPを持たない.
GはM-増加パスPを持つならばマッチングMは最大
でないを示す(対偶).
PはM-増加パスなので,M△Pはマッチングであ
り,Mより多くの辺を持つ.
- 2つの集合AとBに対して,A△B = A ∪ B  (A ∩ B)とする.
マッチングMが最大でないならばGはM-増加パスPを

持つことを示す(対偶).
最大マッチングをM’とし,M△M’を考える.M△M’
は高々次数が2のグラフになるので,パスとサイクル
の集まりである.さらに全てのパスはMとM’の辺を
交互に使うので,必ずM-増加パスを持つ.
性質1の証明(B → A)
!11
性質1: マッチングMが最大である GはM-増加パスPを持たない.
M△M’の例
1. M を空集合とする.
2. M-増加パスPを見つける.
3. MをM△Pに更新する.
4. M-増加パスPがなくなるまで2と3を繰り返す.
どうやってM-増加パスを見つけるのか?
- yosupotアルゴリズム?
- Edmondsアルゴリズム
最大マッチングを求めるアルゴリズム概要
!12
性質1: マッチングMが最大である GはM-増加パスPを持たない.
M-増加パスの発見法
!13
問題:
入力: グラフGとマッチングM
タスク: G中のM-増加パスを1つ出力せよ
なんかdfsしたくなってくる問題…
普通のdfsではダメなので,次のdfsを考える.
- 頂点を2倍にしたグラフ上のdfs.
辺のつけ方はちょっとめんどくさいので,具体例を
見てみよう.
M-増加パスの発見
!14
グラフの生成方法とM-増加パスの発見
!15
前使った辺がマッチングに含まれる
前使った辺がマッチングに含まれない
グラフの生成方法とM-増加パスの発見
!16
前使った辺がマッチングに含まれる
前使った辺がマッチングに含まれない
M-増加パス!!
グラフの生成方法とM-増加パスの発見
!17
前使った辺がマッチングに含まれる
前使った辺がマッチングに含まれない
M-増加パス??
グラフの生成方法とM-増加パスの発見
!18
前使った辺がマッチングに含まれる
前使った辺がマッチングに含まれない
M-増加パス??
このパスは閉路を持つ
こんなパスを見つける
場合がある.
見つけたパスっぽいものの利用
!19
このパスっぽいものも有用である.(下図)
→ 発見したサイクルCを縮約して得られたグラフG’
の最大マッチングとGの最大マッチングのサイズは等
しい.
これを示すために次の条件を示す.
- GがM-増加パスを持つ G’がM’-増加パスを持つ.
偶数長のパス
奇数長のサイクルC
見つけたパスっぽいものの利用
!20
偶数長のパス
奇数長のサイクルC
ちょっと前準備
このパスっぽいものも有用である.(下図)
→ 発見したサイクルCを縮約して得られたグラフG’
の最大マッチングとGの最大マッチングのサイズは等
しい.
これを示すために次の条件を示す.
- GがM-増加パスを持つ G’がM’-増加パスを持つ.
証明: A → B
!21
GがM-増加パスPを持ち,PがC中の頂点を含む場合
CはMにカバーされない頂点を1つだけ持つ.これを
rとする.Pは端点を2つ持ち,1つはrと異なる.これ
をxとする.xはCに含まれない.Pのx-r部分パスP’は
両端点がMにカバーされないので,M-増加パスであ
り,これはM’-増加パスになる.
偶数長のパス
C
GがM-増加パスを持つ G’がM’-増加パスを持つ.
C: 潰した頂点の集合
Cr
x
証明: B → A
!22
P’をG’中のM’-増加パスとする.これはちょっと工夫す
るとG中のM-増加パスになる.
偶数長のパス
C
GがM-増加パスを持つ G’がM’-増加パスを持つ.
C: 潰した頂点の集合
x
C
x
r
証明: B → A
!23
P’をG’中のM’-増加パスとする.これはちょっと工夫す
るとG中のM-増加パスになる.
偶数長のパス
C
GがM-増加パスを持つ G’がM’-増加パスを持つ.
C: 潰した頂点の集合
x
C
x
r
1. カバーされていないそれぞれの点からdfsする.
2. 閉路を見つけたら縮約して,1に戻る.
3. M-増加パスを見つけたらMを増加させる.さら
に,縮約した閉路を全て復元して,1に戻る.
アルゴリズムの概要
!24
1つのM-増加パスの発見には,
M-増加パス発見の始点の候補がO(n)
毎回のdfsにO(n + m)
グラフの縮約の回数がO(n)
の計算が必要.
全体でO(n3(n + m) )時間アルゴリズムになる.
yosupoさんスライドではO(n4)と言っているので
もっと頭が良いことをしてそう
計算量解析
!25
Edomondsのアルゴリズム
!26
yosupoアルゴリズムと同様に,M-増加パスを発見
して,貪欲にマッチングのサイズを大きくする
改善案:
それぞれの頂点から毎回dfsする必要あるのか?
縮約後に1から探索し直す必要があるのか?
Edmonds アルゴリズムの概要
!27
交互森: グラフGとマッチングMに対して,森Fが次
の3つの条件を満たす時,Fを交互森という.
(a) V(F)はMでカバーされない点を全て含み,Fの
どの連結成分もMでカバーされない点をちょうど1
個含む.この頂点を根という.
(b) Fのどの奇点も次数が2である.
(c)任意の頂点vに対して,vからvを含む連結成分
の根までのパスはM-交互パスである.
交互森
!28
vから根までの距離が偶数の時,vを偶点,そうでない時vを奇点という.
交互森: グラフGとマッチングMに対して,森Fが次
の3つの条件を満たす時,Fを交互森という.
交互森の例
!29
(a) V(F)はMでカバーされない点を全て含み,Fのどの連結成分もMでカバーされない点
をちょうど1個含む.
(b) Fのどの奇点も次数が2である.
(c)任意の頂点vに対して,vからvを含む連結成分の根までのパスはM-交互パスである.
偶
奇
偶
奇
偶
交互森の拡張
!30
偶点から辺を探索し,次に見つけた頂点が次の4つの
場合について場合分けして考える.
1. 森に現れていない点
2. 奇点
3. 異なる交互木中の偶点
4. 同じ交互木中の偶点
偶点から辺を探索し,次に見つけた頂点が次の4つの
場合について場合分けして考える.
1. 森に現れていない点
2. 奇点
3. 異なる交互木中の偶点
4. 同じ交互木中の偶点
交互森の拡張
!31
1はただ木に加えるだけ
なので割愛
この場合,この辺は無視して探索を続ける.
2.奇点
!32
偶
奇
偶
奇
偶
この場合,交互木はM-増加パスPを持つ.
Pを使ってマッチングを増大させ,また最初から交互
木を作る
3.異なる交互木中の偶点
!33
偶
奇
偶
奇
偶
この場合,交互木は花を持つ.
因子臨界的グラフ: グラフのどんな頂点を削除してもグラフは完全
マッチングを持つ.
花: G中で|M∩E(H)| = (|V(H)| - 1)/2を満たす因子臨界的部分グラフH
(HはGの誘導部分グラフ)
基点: 花C中でMにカバーされない頂点
4.同じ交互木中の偶点
!34
ここが花!!
偶
奇
偶
奇
偶
4.同じ交互木中の偶点
!35
ここが花!!
偶
奇
偶
奇
偶
グラフ中の花を縮約したグラフをG’とする.この時,G
の最大マッチングのサイズとG’の最大マッチングのサイ
ズが同じになる.
証明は前半のものとほぼ同じ
見つけた花を縮約して,交互木の拡張を続ける.
4.同じ交互木中の偶点
!36
ここが花!!
偶
奇
偶
奇
偶
グラフ中の花を縮約したグラフをG’とする.この時,G
の最大マッチングのサイズとG’の最大マッチングのサイ
ズが同じになる.
証明は前半のものとほぼ同じ
見つけた花を縮約して,交互木の拡張を続ける.
縮約を繰り返すことで,M-増加パスの存在判定ができる.
縮約とM-増加パスの発見回数はO(n)回なので,復元が線形
時間ならば,全体でO(n(n + m))時間になる.
どうやってO(n + m)時間で復元しよう?
縮約後の交互森中でのM-増加パスの復元
!37
1
2 3
4 56
7
縮約後のグラフG’からどうやってM-増加パスを発見

するか?
復元の難しい例
!38
縮約される!!
1
2 3
4 56
7
M-増加パスを復元する場合,マッチングに含まれる辺
は選択の余地なく選べる.マッチングに含まれない辺を
決定するのが難しい.
したがって,それぞれの頂点に次にどこにいくかを決
めて一意性を保つようにする.
復元が難しい理由
!39
縮約される!!
1
2 3
4 56
7
縮約後のグラフは花Cを縮約したグラフである.この
時,Cの縮約に対応する頂点は偶点になる.
この花Cを偶花という.
偶花に含まれる頂点は偶点とする
縮約後のグラフ
!40
復元のためのデータ構造: M-交互耳分解
!41
M-増加パスを復元できるようにするため,花をM-交互耳
分解する.
耳分解: グラフを{r} ∪ P1 ∪ P2 …というように,いくつか
のパスに分解すること.ここで,Piは{r} ∪ P1 ∪ … Pi-1を
中の頂点を端点にもつ.
r
復元のためのデータ構造: M-交互耳分解
!42
M-増加パスを復元できるようにするため,花をM-交互耳
分解する.
耳分解: グラフを{r} ∪ P1 ∪ P2 …というように,いくつか
のパスに分解すること.ここで,Piは{r} ∪ P1 ∪ … Pi-1を
中の頂点を端点にもつ.
r
P1
復元のためのデータ構造: M-交互耳分解
!43
M-増加パスを復元できるようにするため,花をM-交互耳
分解する.
耳分解: グラフを{r} ∪ P1 ∪ P2 …というように,いくつか
のパスに分解すること.ここで,Piは{r} ∪ P1 ∪ … Pi-1を
中の頂点を端点にもつ.
r
P1
P2
復元のためのデータ構造: M-交互耳分解
!44
M-増加パスを復元できるようにするため,花をM-交互耳
分解する.
M-交互耳分解: 耳分解の各パスがM-交互パス,または
|E(C) ∩ M| + 1 = |E(C)  M|になる閉路Cである耳分解
r
マッチングM
復元のためのデータ構造: M-交互耳分解
!45
M-増加パスを復元できるようにするため,花をM-交互耳
分解する.
M-交互耳分解: 耳分解の各パスがM-交互パス,または
|E(C) ∩ M| + 1 = |E(C)  M|になる閉路Cである耳分解
r
マッチングM
閉路C
復元のためのデータ構造: M-交互耳分解
!46
M-増加パスを復元できるようにするため,花をM-交互耳
分解する.
M-交互耳分解: 耳分解の各パスがM-交互パス,または
|E(C) ∩ M| + 1 = |E(C)  M|になる閉路Cである耳分解
r
マッチングM
閉路C
M-交互パスP
復元のためのデータ構造: M-交互耳分解
!47
µ(x): マッチングMに含まれる辺に対応する頂点を返す.
ψ(x): M-交互パスでMに含まれない辺に対応する頂点を返す.
M-交互耳分解はO(n + m)時間で計算可能.
性質2:
Gが全てのPiが奇数長のM-交互耳分解を持つ Gが因子臨界
的グラフである.
r
マッチングM
閉路C
M-交互パスP
縮約前グラフのM-交互耳分解を持っていると簡単にM-増
加パスが計算できる.
これで復元も線形時間!
M-増加パスの復元
!48
Edmonds アルゴリズムは次のように実行される.
1. Mにカバーされない頂点からなる,辺を持たない交
互森を作る.
2. 交互木の偶点の隣接点を見て,交互森を拡張する.
3. 縮約操作,またはM-増加パスを発見した場合は1に
戻る.
全体としては,縮約と増加が発生する回数がO(n)回で,毎
回の縮約,またはM-増加パスの発見にO(n + m)なので,全
体でO(n3)時間アルゴリズムになる.
Edmonds アルゴリズムのまとめ
!49
問題例
立命館合宿2018 Day2 G問題
!50
終わり
お疲れ様でした!!!!!!!
!51
因子臨界的グラフ: グラフのどんな頂点を削除して
もグラフは完全マッチングを持つ.
- 先ほどのサイクルCをより一般化した概念
花: G中で|M∩E(H)| = (|V(H)| - 1)/2を満たす因子臨界
的部分グラフH(HはGの誘導部分グラフ)
グラフの因子臨界的部分グラフと花分解
!52
ここはGの花!
交互森: グラフGとマッチングMに対して,森Fが次
の3つの条件を満たす時,Fを交互森という.
(a) V(F)はMでカバーされない点を全て含み,F喉
の連結成分もMでカバーされない点をちょうど1
個含む.この頂点を根という.
(b) Fのどの奇点も次数が2である.
(c)任意の頂点vに対して,vからvを含む連結成分
の根までのパスはM-交互パスである.
グラフの交互森
!53
vから根までの距離が偶数の時,vを偶点,そうでない時vを奇点という.

More Related Content

What's hot

What's hot (20)

AtCoder Beginner Contest 008 解説
AtCoder Beginner Contest 008 解説AtCoder Beginner Contest 008 解説
AtCoder Beginner Contest 008 解説
 
AtCoder Regular Contest 046
AtCoder Regular Contest 046AtCoder Regular Contest 046
AtCoder Regular Contest 046
 
AtCoder Regular Contest 002
AtCoder Regular Contest 002AtCoder Regular Contest 002
AtCoder Regular Contest 002
 
動的計画法を極める!
動的計画法を極める!動的計画法を極める!
動的計画法を極める!
 
Rolling Hashを殺す話
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話
 
AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界
 
直前合宿 講義スライド
直前合宿 講義スライド直前合宿 講義スライド
直前合宿 講義スライド
 
全域木いろいろ
全域木いろいろ全域木いろいろ
全域木いろいろ
 
AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説
 
AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説
 
arc047
arc047arc047
arc047
 
Arc015途中まで解説
Arc015途中まで解説Arc015途中まで解説
Arc015途中まで解説
 
2SAT(充足可能性問題)の解き方
2SAT(充足可能性問題)の解き方2SAT(充足可能性問題)の解き方
2SAT(充足可能性問題)の解き方
 
AtCoder Beginner Contest 025 解説
AtCoder Beginner Contest 025 解説AtCoder Beginner Contest 025 解説
AtCoder Beginner Contest 025 解説
 
グラフネットワーク〜フロー&カット〜
グラフネットワーク〜フロー&カット〜グラフネットワーク〜フロー&カット〜
グラフネットワーク〜フロー&カット〜
 
AtCoder Regular Contest 029 解説
AtCoder Regular Contest 029 解説AtCoder Regular Contest 029 解説
AtCoder Regular Contest 029 解説
 
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く
 
ユークリッド最小全域木
ユークリッド最小全域木ユークリッド最小全域木
ユークリッド最小全域木
 
AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説
 

More from HCPC: 北海道大学競技プログラミングサークル

More from HCPC: 北海道大学競技プログラミングサークル (20)

写像 12 相
写像 12 相写像 12 相
写像 12 相
 
ACPC 2017 Day3 F: 掛け算は楽しい
ACPC 2017 Day3 F: 掛け算は楽しいACPC 2017 Day3 F: 掛け算は楽しい
ACPC 2017 Day3 F: 掛け算は楽しい
 
ACPC 2017 Day3 D: 優柔不断
ACPC 2017 Day3 D: 優柔不断ACPC 2017 Day3 D: 優柔不断
ACPC 2017 Day3 D: 優柔不断
 
ACPC 2019 Day3 G: Restricted DFS
ACPC 2019 Day3 G: Restricted DFSACPC 2019 Day3 G: Restricted DFS
ACPC 2019 Day3 G: Restricted DFS
 
ACPC 2019 Day3 F: 部分文字列分解
ACPC 2019 Day3 F: 部分文字列分解ACPC 2019 Day3 F: 部分文字列分解
ACPC 2019 Day3 F: 部分文字列分解
 
ACPC 2019 Day3 E: 総和の切り取り
ACPC 2019 Day3 E: 総和の切り取りACPC 2019 Day3 E: 総和の切り取り
ACPC 2019 Day3 E: 総和の切り取り
 
ACPC 2019 Day3 B: パフェ
ACPC 2019 Day3 B: パフェACPC 2019 Day3 B: パフェ
ACPC 2019 Day3 B: パフェ
 
ACPC 2019 Day3 A: 間違い探し
ACPC 2019 Day3 A: 間違い探しACPC 2019 Day3 A: 間違い探し
ACPC 2019 Day3 A: 間違い探し
 
HUPC 2019 Day2 G: 木
HUPC 2019 Day2 G: 木HUPC 2019 Day2 G: 木
HUPC 2019 Day2 G: 木
 
HUPC 2019 Day2 E: ジャム
HUPC 2019 Day2 E: ジャムHUPC 2019 Day2 E: ジャム
HUPC 2019 Day2 E: ジャム
 
HUPC 2019 Day2 H: Revenge of UMG
HUPC 2019 Day2 H: Revenge of UMGHUPC 2019 Day2 H: Revenge of UMG
HUPC 2019 Day2 H: Revenge of UMG
 
HUPC 2019 Day2 F: MOD Rush
HUPC 2019 Day2 F: MOD RushHUPC 2019 Day2 F: MOD Rush
HUPC 2019 Day2 F: MOD Rush
 
HUPC 2019 Day2 C: 串刺し
HUPC 2019 Day2 C: 串刺しHUPC 2019 Day2 C: 串刺し
HUPC 2019 Day2 C: 串刺し
 
HUPC 2019 Day1 F: グリッドの番号
HUPC 2019 Day1 F: グリッドの番号HUPC 2019 Day1 F: グリッドの番号
HUPC 2019 Day1 F: グリッドの番号
 
HUPC 2019 Day1 E: 最短経路の復元
HUPC 2019 Day1 E: 最短経路の復元HUPC 2019 Day1 E: 最短経路の復元
HUPC 2019 Day1 E: 最短経路の復元
 
HUPC 2019 Day1 D: 貪欲が最適?
HUPC 2019 Day1 D: 貪欲が最適?HUPC 2019 Day1 D: 貪欲が最適?
HUPC 2019 Day1 D: 貪欲が最適?
 
HUPC 2019 Day1 C: 短絡評価
HUPC 2019 Day1 C: 短絡評価HUPC 2019 Day1 C: 短絡評価
HUPC 2019 Day1 C: 短絡評価
 
HUPC 2019 Day1 B: 自身の 2 倍
HUPC 2019 Day1 B: 自身の 2 倍HUPC 2019 Day1 B: 自身の 2 倍
HUPC 2019 Day1 B: 自身の 2 倍
 
HUPC 2019 Day1 A: four tea
HUPC 2019 Day1 A: four teaHUPC 2019 Day1 A: four tea
HUPC 2019 Day1 A: four tea
 
Convex Hull Trick
Convex Hull TrickConvex Hull Trick
Convex Hull Trick
 

一般グラフの最大マッチング