--- tags: 圖論 title: 二分圖、匹配、匈牙利算法 --- :::warning ## [補個vector存圖法](https://www.notion.so/vector-f437fa3263f840c1a21cdebe5d4384ce) ::: :::info - #### 模板題 [ZJ c889](https://zerojudge.tw/ShowProblem?problemid=c889) - #### 模板題 [TIOJ 1209](https://tioj.ck.tp.edu.tw/problems/1209) - #### [CF 557D](https://codeforces.com/problemset/problem/557/D) - #### [CF 1144F](https://codeforces.com/problemset/problem/1144/F) ::: :::success # 二分圖 Bipartite Graph  ## 定義 - 將所有點分成兩個集合,不存在連接同集合中兩點的邊 ## 判定 - 著色法: - 使用DFS以兩個顏色著色,嘗試將任意相鄰兩點塗上不同顏色 - 如果發現有一點跟「相鄰且已經塗色的點」同一顏色,則二分圖不成立,反之成立 - 實作: - 紀錄每個點的顏色(紅、藍、未塗色),並使用DFS走訪塗色+判定 ::: :::success # 匹配 Matching ## 定義  - 在圖上找一組邊,任兩條邊沒有公用點 - 完美匹配、最大匹配、最大邊權匹配。。。 # 匈牙利算法 Hungarian algorithm - #### [ZJ c455](https://zerojudge.tw/ShowProblem?problemid=c455) - #### [UVA 10080](https://onlinejudge.org/index.php?option=onlinejudge&page=show_problem&problem=1021) ## 用途 - 無邊權二分圖上找最大匹配(邊數最多) ### 交替路徑和增廣路徑 - 交替路徑:選一個點當起點,沿著(邊)未匹配、匹配交替走 1 -> 5 -> 2  未匹配、匹配邊對調,匹配數不變 - 增廣路徑:在走交替路徑的途中遇到未匹配的點(兩端皆未匹配) 1 -> 7 -> 4 -> 8  未匹配、匹配邊對調,匹配數+1 ## 匈牙利樹 - 從一個點開始走交替路徑直到無法再擴展為止,且葉節點已匹配,形成的樹  ## 實作 - 找到增廣路徑 -> 對調匹配、未匹配邊 - 找到匈牙利樹 -> 刪除(不看) - 無增廣路徑即為最大匹配 ::: :::success # 網路流實作二分圖匹配 ## 最大基數匹配(Maximum cardinality bipartite matching)  ### 將問題轉化成最大流問題 1. 增加源點s與匯點t 2. 建立弧連接s和X中每一點,方向由s指向X 3. 建立弧連接$t$和Y中每一點,方向由Y指向t 4. 將原二分圖中的每條邊改為弧,方向由X指向Y 5. 將每條弧容量設定為1 - 求最大流,路徑中原圖的邊形成的邊集即為最大基數匹配 ## 最大權完美匹配(Maximum weighted perfect matching) ### 將問題轉化為最大費用最大流問題 1. 增加源點$s$與匯點$t$ 2. 建立弧連接$s$和X中每一點,方向由$s$指向X,==容量設定為1,費用設定為0== 3. 建立弧連接$t$和Y中每一點,方向由Y指向$t$,==容量設定為1,費用設定為0== 4. 將原二分圖中的每條邊改為弧,方向由X指向Y,==容量設定1,費用設定為原邊權== - 求最大費用最大流,路徑中原圖的邊形成的邊集即為最大權完美匹配 :::
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.