設簡單二部圖\(G=< A,B,E>,M\subset E,\)若是\(M\)中任意兩條邊都不相鄰,則稱\(M\)是\(G\)的匹配。當\(M\)的邊數最多時,\(M\)稱做最大匹配。當\(|A|=|B|=n\)時,邊數爲\(n\)的匹配稱做完美匹配。算法
設\(M\)是二部圖\(G\)的一個匹配,則稱\(M\)中的邊爲匹配邊,\(G\)中不屬於\(M\)的邊爲非匹配邊,與匹配邊關聯的頂點爲飽和點。\(G\)中由匹配邊和非匹配邊交替構成的路徑稱爲交錯路徑,起點和重點都是非飽和頂點的交錯路徑稱爲增廣交錯路徑。spa
設\(M\)是二部圖\(G\)的一個匹配,\(P\)是一條關於\(M\)的增廣交錯路徑,則\(M'=M\bigoplus E(P)\)(和原來匹配作對稱差)是一個匹配,且\(|M'|=|M|+1\),其中\(E(P)\)是\(P\)的邊集。it
二部圖的匹配是最大匹配當且僅當不存在關於它的增廣交錯路徑。class
(1).從初始匹配\(M\)開始,尋找一條關於它的增廣交錯路徑\(P\)im
(2).令\(M\leftarrow M\bigoplus E(P)\)time
(3).檢查是否存在關於\(M\)的增廣交錯路徑\(P\),若不存在,算法結束。不然轉(2).math
1.設當前匹配爲\(M\),對\(A\)中每個非飽和點\(A_i\)加標號\(l(A_i)=0\),\(A_i\)是已標號但未檢查的點。tar
2.對任意已標號但未檢查的頂點\(A_i\),把全部與其相鄰但未標號的頂點\(B_j\)標號爲\(l(B_j)=A_i\).
3.若是\(B_j\)是非飽和點,則找到一條增廣交錯路徑,修改匹配,從新開始標號。
4.若是\(B_j\)是飽和點,則設\((A_k,B_j)\in M\),令\(l(A_k)=B_j\),則\(A_k\)成爲已標號未檢查頂點,\(A_i\)成爲已標號已檢查的頂點。
5.重複算法,直到\(A\)中不存在已標號未檢查的頂點。
設二部圖\(G=< A,B,E>\)。在匈牙利算法的每一個階段若找到增廣交錯路徑\(P\),令\(M\leftarrow M\bigoplus E(P)\).對於初始狀態,\(M=\emptyset\)是\(G\)的匹配。當計算終止時,不存在增廣交錯路徑。
除去算法最終階段外,算法每一個階段增長一條匹配邊,匹配邊總數爲\(\min\{|A|,|B|\}\)條,因此最多有\(\min\{|A|,|B|\}+1\)個階段,在每一個標號階段中,每條邊最多被檢查一次,增廣交錯路徑長度不超過\(2|M|+1\),因此每一個階段將在\(O(|E|)\)內完成。故整個算法在\(O(\min\{|A|,|B|\}\times E)\)步內停止。