KM演算法理解

2021-06-05 02:21:06 字數 1398 閱讀 7271

**

[二分圖帶權匹配與最佳匹配]

什麼是二分圖的帶權匹配?二分圖的帶權匹配就是求出乙個匹配集合,使得集合中邊的權值之和最大或最小。而二分圖的最佳匹配則一定為完備匹配,在此基礎上,才要求匹配的邊權值之和最大或最小。二分圖的帶權匹配與最佳匹配不等價,也不互相包含

我們可以使用km演算法實現求二分圖的最佳匹配。方法我不再贅述,可以參考tianyi的講解。km演算法可以實現為o(n^3)。

[km演算法的幾種轉化]

km演算法是求最大權完備匹配,如果要求最小權完備匹配怎麼辦?方法很簡單,只需將所有的邊權值取其相反數,求最大權完備匹配,匹配的值再取相反數即可。

km演算法的執行要求是必須存在乙個完備匹配,如果求乙個最大權匹配(不一定完備)該如何辦?依然很簡單,把不存在的邊權值賦為0。

km演算法求得的最大權匹配是邊權值和最大,如果我想要邊權之積最大,又怎樣轉化?還是不難辦到,每條邊權取自然對數,然後求最大和權匹配,求得的結果a再算出e^a就是最大積匹配。至於精度問題則沒有更好的辦法了。

[求最小(大)權匹配的費用流建模方法]

求最小(大)權匹配,可以用最小(大)費用最大流的方法。和二分圖最大匹配的構圖方法類似,新增附加源s和附加匯t,從s向二分圖x集合中每個頂點連線一條權值為0,容量為1的有向邊,從y集合中每個頂點向t也連線一條權值為0,容量為1的有向邊。然後把原有的邊變成容量為1,權值不變的有向邊。求從s到t的最小(大)費用最大流,就能求得最小(大)權匹配。

上述建模求最大權匹配的方法求得的一定是最佳匹配(如果存在完備匹配),因為s到x集合每條邊全部滿流。如下圖所示,最大費用為2。

要求最大權匹配(不一定完備匹配)。如下圖,只需再引入乙個頂點a,從x集合的每個頂點向a連線一條容量為1,權值為0的邊,然後再由a向t連線一條權值為0,容量不小於|x|的邊,求最大費用最大流,這時最大費用是100。                           (這樣就可以保證s的所有出邊都滿流)

最小權匹配也類似,不過新加的邊權要為乙個極大值,大於所有已有邊權值。

[km演算法與費用流的比較]

從理論上分析,km演算法的時間複雜度比費用流要好,但是實際上和較好的費用流演算法比起來執行效率是差不多的,km演算法優勢僅僅在於程式設計容易。km演算法也有其不可避免的侷限性,就是必須用鄰接矩陣來表示。這樣會浪費很多的空間,尤其是圖相當稀疏的時候。而對於十分稀疏的圖,許多優秀的費用流演算法效率是很高的。這並不說明km演算法不如費用流,畢竟在資訊學競賽中,程式設計的複雜度也是乙個相當重要的需要考慮的因素。

A 演算法理解

廣度優先 bfs 和深度優先 dfs 搜尋 深度優先搜尋,用俗話說就是不見棺材不回頭。演算法會朝乙個方向進發,直到遇到邊界或者障礙物,才回溯。一般在實現的時候,我們採用遞迴的方式來進行,也可以採用模擬壓棧的方式來實現。如下圖,s代表起點,e代表終點。我們如果按照右 下 左 上這樣的擴充套件順序的話,...

dijkstra 演算法理解

求有向圖中乙個源點到其他頂點的最短距離 自己的理解 剛開始的時候相當於有三個集合 v 頂點集合 s 已求得的最短距離頂點集合,假設求a到其他頂點的最短距離 s 剩餘頂點集合 d 儲存的是最短距離值 求一維陣列中的最小值的下標,這個陣列不包含已經求得的頂點 找出最小值下標後,放入到s中,然後求剩餘頂點...

遞迴演算法理解

遞迴演算法看起來比較簡單,當總覺得沒能領會到它的精髓,平常也沒可以使用它。今天看到這篇文章,說的比較透徹 1,遞迴與迴圈之間的關係 看過這樣一道題,問,程式結構化設計的三種基礎結構,順序 選擇 迴圈是不是必須的?當然,你知道這樣乙個論斷,只要有這三種就足夠了 但是能不能更少呢?答案是 可以 原因就是...