利用匈牙利演算法可以求得二分圖最大匹配。
匈牙利演算法的基本原理如下:
①置m為空;
②找到一條增廣路徑p,通過異或操作獲得更大的匹配m'代替m;
③重複②直到找不到新的增廣路徑。
增廣路徑的定義如下:
若p是圖g中一條聯通兩個未匹配頂點的路徑,且屬於m的邊和不屬於m的邊在p上交替出現,則稱p為相對於m的一條增廣路徑。
上個圖理解一下:
①初始狀態
當前已有邊(1,1')和(4,3')屬於m。
②找到一條增廣路徑p
如圖,增廣路徑p為:(3 - 1' - 1 - 3' - 4 - 4')。其中,不屬於m的路徑有:(3, 1')、(1, 3')和(4, 4'),屬於m的路徑有(1『, 1)和(3', 4)。顯然,在上面的路徑p中,不屬於m的路徑和屬於m的路徑是交替出現的。[3-1'(藍), 1'-1(黑), 1-3'(藍), 3'-4(黑), 4-4'(藍)]
③對第②步中的圖進行取反,將原來屬於m的路徑去除,將原來不屬於m的路徑加入m中。(即藍色的邊變成黑色,黑色的邊變成藍色)
④完成。
最後再看一下由增廣路徑的定義可以推出的三個結論:
①p的路徑長度必定為奇數,第一條邊和最後一條邊都不屬於m
②p經過取反操作可以得到乙個更大的匹配m
③m為g的最大匹配當且僅當不存在相對於m的增廣路徑
匈牙利演算法和增廣路的學習
匈牙利和增廣路的概念 上面這個鏈結是最簡單的增廣路求最大匹配,其中所有邊權都為1 二分圖詳解 匈牙利演算法 km演算法 gale shapley 婚姻匹配演算法演算法 例題 km演算法中,邊權和點之間分別有val,一般來說,定義x,y,定義所有的val x val y w x y 而我們所要找的,就...
增廣路徑求解最大流
關於什麼是最大流。我說不清楚,而且也沒有別人的比喻生動。主要是我懶,不想畫圖 演算法的核心在於 找到增廣路徑,修改它,繼續找,直到沒有。while findaugmentpath 判斷是否有增廣路 maxflow maxflow delta 最大流增加 modifygraph 對增廣路進行修改 en...
匈牙利演算法
匈牙利演算法 edmonds演算法 步聚 1 首先用 標記x中所有的非m頂點,然後交替進行步驟 2 3 2 選取乙個剛標記 用 或在步驟 3 中用 yi 標記 過的x中頂點,例如頂點xi,如果xi與y為同一非匹配邊的兩端點,且在本步驟中y尚未被標記過,則用 xi 去標記y中頂點y。重複步驟 2 直至...