km演算法 用於求二分圖的最佳完美匹配 即權值最大的完美匹配
如果你也是個剛來學習km演算法的人 大概的用途肯定還是知道的吧 還是直接說重點吧
首先 理解km演算法前 必須有以下3個概念
1.可行頂標 對於乙個賦值二分圖g(x,y,e,w) (x,y 代表二分圖的兩邊頂點標號 e代表邊 w代表邊的權值 ) 我們對兩邊的每乙個頂點都賦予乙個額外的值 使得對於二分圖g內的所有邊 e=xy 均有 lx(x)+ly(y)>=w(xy)
其實不管什麼樣的圖 什麼樣的邊權 可行頂標必然存在 例如 lx(x)=max w(xy) ly(y)=0
2.在已經賦值可行頂標的二分圖中 保留所有lx(x)+ly(y)=w(x)(y) 的邊 刪去其他的邊 形成的新的圖稱為生成子圖
3.在生成子圖中的任意乙個完美匹配都是最佳完美匹配 反過來 g的任意乙個最佳完美匹配都包含在 生成子圖中
可能第三條定理來的有些突然 有點讓人懵逼 但是你只要稍微想一下 你就會發現這很明顯
因為這個匹配 他所有權值之和就是可行頂標之和 而 可行頂標之和必然是權值之和最大的(因為第一條
但問題是 對於當前頂標所推出的生成子圖 並不一定存在完美匹配 這時,可以用某種方法對頂標進行調整。調整的方法是:根據最後一次不成功的尋找交錯路的dfs,取所有i被訪問到而j沒被訪問到的邊(i,j)的lx[i]+ly[j]-w[i][j]的最小值d。將交錯樹中的所有左端點的頂標減小d,右端點的頂標增加d。經過這樣的調整以後:原本在匯出子圖裡面的邊,兩邊的頂標都變了,不等式的等號仍然成立,仍然在匯出子圖裡面;原本不在匯出子圖裡面的邊,它的左端點的頂標減小了,右端點的頂標沒有變,而且由於d的定義,不等式仍然成立,所以他就可能進入了匯出子圖里。
如果還看不懂 我只能貼上我學習過程看的部落格了 畢竟只有文字可能不好理解 我又懶
文字理解
萌萌噠的妹子寫的**詳解
最後是來幾套題
km演算法學習小記
這個演算法其實在學匈牙利演算法時就看過了,不過當時沒搞懂?現在一看,其實還挺好理解的。km演算法是求最大權完備匹配,事實上它同時能處理最小權完備匹配 把邊權取反 和非完備匹配 新增原本不存在的邊且邊權賦值為0 另外還在一位神犇的部落格裡了解到,如果我想要邊權之積最大,則每條邊權取自然對數,然後求最大...
匈牙利演算法 KM演算法
匈牙利演算法 求最大匹配,那麼我們希望每乙個在左邊的點都盡量找到右邊的乙個點和它匹配。我們依次列舉左邊的點x的所有出邊指向的點y,若y之前沒有被匹配,那麼 x,y 就是一對合法的匹配,我們將匹配數加一,否則我們試圖給原來匹配y的x 重新找乙個匹配,如果x 匹配成功,那麼 x,y 就可以新增為一對合法...
匈牙利演算法,KM演算法
bool find int x return false 主程式 for i 1 i n i include include include include include include include include include include include include include...