1. 程式人生 > >二分圖帶權匹配問題

二分圖帶權匹配問題

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

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

我們可以使用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。

km1

要求最大權匹配(不一定完備匹配)。如下圖,只需再引入一個頂點A,從X集合的每個頂點向A連線一條容量為1,權值為0的邊,然後再由A向T連線一條權值為0,容量不小於|X|的邊,求最大費用最大流,這時是100。

km2

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

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

從理論上分析,KM演算法的時間複雜度比費用流要好,但是實際上和較好的費用流演算法比起來執行效率是差不多的,KM演算法優勢僅僅在於程式設計容易。KM演算法也有其不可避免的侷限性,就是必須用鄰接矩陣來表示

。這樣會浪費很多的空間,尤其是圖相當稀疏的時候。而對於十分稀疏的圖,許多優秀的費用流演算法效率是很高的。這並不說明KM演算法不如費用流,畢竟在資訊學競賽中,程式設計的複雜度也是一個相當重要的需要考慮的因素。