演算法學習 KM演算法

2021-07-16 12:12:55 字數 1026 閱讀 6501

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...