匈牙利算法是基於Hall定理中充分性證明的思想,其基本步驟為:
1.任給初始匹配M;
2.若X已飽和則結束,否則進行第3步;
3.在X中找到壹個非飽和頂點x0,作V1 ← {x0}, V2 ← Φ;
4.若T(V1) = V2則因為無法匹配而停止,否則任選壹點y ∈T(V1)\V2;
5.若y已飽和則轉6,否則做壹條從x0 →y的可增廣道路P,M←M?E(P),轉2;
6.由於y已飽和,所以M中有壹條邊(y,z),作 V1 ← V1 ∪{z}, V2 ← V2 ∪ {y}, 轉4;
設數組up[1..n] --- 標記二分圖的上半部分的點。
down[1..n] --- 標記二分圖的下半部分的點。
map[1..n,1..n] --- 表示二分圖的上,下部分的點的關系。
True-相連, false---不相連。
over1[1..n],over2[1..n] 標記上下部分的已蓋點。
use[1..n,1..n] - 表示該條邊是否被覆蓋 。
首先對讀入數據進行處理 ,對於壹條邊(x,y) ,起點進集合up,終點進集合down。 標記map中對應元素為true。
1. 尋找up中壹個未蓋點 。
2. 從該未蓋點出發 ,搜索壹條可行的路線 ,即由細邊出發, 由細邊結束, 且細粗交錯的路線 。
3. 若找到 ,則修改該路線上的點所對應的over1,over2,use的元素。重復步驟1。
4. 統計use中已覆蓋的邊的條數total,總數n減去total即為問題的解。