KM算法簡單描述:
首先 km算法給兩個結點集合的每個結點一個點權(也叫頂標 或者標杆)
左側結點i點權記作A[i] 右側爲B[]Km算法求的是二分圖的最大權完美匹配 所以如果有邊不存在 則讓邊權爲0即可
並規定 對於以匹配邊u v 必須保證w[u][v] =A[u]B[v] 這個匹配纔是合法的
也就是說只有保證了上述情況 才能將這條邊加入匹配中
在算法過程中保證對於任意一條邊 A[u]+B[v]>=w[u][v]
Km算法的大致過程
首先初始化A[] B[] 不妨使A[u]=max(each(w[u][v])) B[u]=0
之後使用類似匈牙利算法的思路從A中結點出發找增廣路 不同的是增廣路上的邊必須符合w[u][v] =A[u]B[v] 若增廣失敗 則考慮下面
當增廣失敗時 說明一些結點的頂標太大了(後面說爲什麼不是太小) 導致沒有邊可用
所以這個時候只要將一些頂標的權值修改 使得一些邊能夠符合要求 這樣就能成功的找增廣路了
當增廣失敗時我們在找交錯路的時候得到了一顆交錯樹 以A中結點爲起點
把交錯樹中 A頂點的頂標全都減小某個d值,頂點B的頂標全都增加d值 ,那麼我們會發現:
1)兩端都在交錯樹中的邊的值沒有變化。也就是說原來符合A+B=w的邊,現在仍然符合
2)兩端都不在交錯樹中的邊A[]和B[]都沒有變化。
3)A端不在交錯樹中, B端在交錯樹中的邊,它的 A+B的值有所增大。
4)B端在交錯樹中,A端不在交錯樹中的邊 ,它的A+B的值有所減小。它原來不符合要求,現在可能A+B=w,從而增加了找增廣路時可選擇的邊。
現在的問題就是求 d值了。爲了使A+B>=w始終成立,且至少有一條新邊能夠符合匹配的條件,d應該等於:min(A[i]+B[j]-w[i][j])( i在交錯樹中,j不在交錯樹中)
所以km算法的基本步驟如下
(1) 初始化標杆
(2) 用匈牙利算法尋找完備匹配
(3) 若未找到完備匹配則修改標杆
(4) 重複(2)(3)直到匹配完成
注意
1.Km算法求的是完美匹配最大權 所以如果沒有邊 要加上0邊權的邊使算法能夠正常進行(或者特殊判斷)
2.Km算法正確的原因 km算法一步一步減小頂標的值 而這個減小量一直是最小的 在完美匹配之後 邊權之和就是點權之和 而一步一步減小頂標的值決定了在找到完美匹配的時候 頂標的和一定是最大的 所以邊權之和也一定最大
對於找最小權值的匹配 只需要將所有權值取反 按最大權求一次
找到的邊即是最小值的邊