Km算法 二分圖最大權匹配

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算法一步一步減小頂標的值 而這個減小量一直是最小的  在完美匹配之後 邊權之和就是點權之和 而一步一步減小頂標的值決定了在找到完美匹配的時候 頂標的和一定是最大的 所以邊權之和也一定最大

對於找最小權值的匹配 只需要將所有權值取反  按最大權求一次
找到的邊即是最小值的邊



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章