匈牙利算法与套题
匈牙利算法與套題
匈牙利算法是利用增廣路來找二分圖里的最大匹配問題。
二分圖的概念:
設G=(V, E)是一個無向圖。如果頂點集V可分割為兩個互不相交的子集U和V,并且圖中每條邊連接的兩個頂點一個在U中,另一個在V中,則稱圖G為二分圖。
如何判斷給你的圖為一個二分圖:染色法(BFS判斷)
- 染色法就是將二分圖中的兩個不相關的子區間染成不同顏色(如上圖中U被染成藍色,V被染成綠色),這樣在這個圖里面的每條邊的端點都是不同的顏色。 — wiki。
- 所以在一個圖中,我們隨便從一個點從0開始進行BFS(廣度優先搜索),每次搜索到的點先進行判斷是否被搜過,如果沒有被搜過,那么這個搜到的點 = 目前的點+1.如果被搜過,就要判斷兩個值是否同奇或者同偶,如果不滿足同奇或者同偶,就說明不滿足染色法,就不是一個二分圖。
下面是一個圖,用染色法標記發現它是一個二分圖
上面的圖轉換成二分圖為:二分圖中幾個小知識:
- 注:完全匹配一定是最大匹配,最大匹配不一定是完全匹配。
增廣路的概念:
在網上搜了一下增廣路發現有點看不懂:
- 若P是圖G中一條連通兩個未匹配頂點的路徑,并且屬于M的邊和不屬于M的邊(即已匹配和待匹配的邊)在P上交替出現,則稱P為相對于M的一條增廣路徑(舉例來說,有A、B集合,增廣路由A中一個點通向B中一個點,再由B中這個點通向A中一個點……交替進行)。 —百度百科
然后在網上瘋狂找資料找到了一個易懂的:通過交替路找增廣路
- 交替路:再G中的邊,匹配的邊和未被匹配的邊交替出現
- 增廣路:從未匹配的邊開始,走交替路,并以未匹配的邊結束。
匈牙利算法:
注: M為二分圖以匹配邊的集合。
當時我在這里不理解,為什么找到了增廣路取反得到的新M集合(M’)就要比舊M集合更優?
其實這里你畫一下圖就很好理解了,這里我先用文字描述一下:因為增廣路是從未匹配開始到未匹配結束,所以你對增廣路取反必定會在原來匹配邊的基礎上增加一條匹配邊。
如下圖:上圖為舊M集合,下圖為取反后的新M集合。可看出取反后的M集合里的匹配條數多了一條。
匈牙利算法題集:
匈牙利板子題:POJ3041
題意:輸入兩個數n,m。n為點集,m為邊集。然后m組數據是從X點集到Y點集的邊。要你求最小覆蓋數,也就是最大匹配數。
點擊查看代碼(DFS+鄰接矩陣)
點擊查看代碼(BFS+鄰接矩陣)
hdu2063
點擊查看代碼(BFS+鄰接矩陣)
二分圖判定:hihocoder1121
BFS+鄰接表
參考資料:
趣寫算法系列之–匈牙利算法
匈牙利算法
二分圖匹配——匈牙利算法和KM算法
二分圖的最大匹配、完美匹配和匈牙利算法
總結
- 上一篇: codeforce 1070 H
- 下一篇: 好用的数学公式(持续更新中)