km演算法是通過給每個頂點乙個標號(叫做頂標)來把求最大權匹配的問題轉化為求完備匹配的問題的。
設頂點xi的頂標為a[i],頂點yi的頂標為b[i],頂點xi與yj之間的邊權為w[i,j]。
在演算法執行過程中的任一時刻,對於任一條邊(i,j), a[i]+b[j]>=w[i,j]始終成立。km演算法的正確性基於以下定理:
若由二分圖中所有滿足a[i]+b[j]=w[i,j]的邊(i,j)構成的子圖(稱做相等子圖(概念很重要))有完備匹配,那麼這個完備匹配就是二分圖的最大權匹配。
這個定理是顯然的。因為對於二分圖的任意乙個匹配,如果它包含於相等子圖,那麼它的邊權和等於所有頂點的頂標和(顯然這是最大的);如果它有的邊不包含於相等子圖,那麼它的邊權和小於所有頂點的頂標和。所以相等子圖的完備匹配一定是二分圖的最大權匹配。
初始時為了使a[i]+b[j]>=w[i,j]恆成立,令a[i]為所有與頂點xi關聯的邊的最大權,b[j]=0。如果當前的相等子圖沒有完備匹配,就按下面的方法修改頂標以使擴大相等子圖,直到相等子圖具有完備匹配為止。
我們求當前相等子圖的完備匹配失敗了,是因為對於某個x頂點,我們找不到一條從它出發的交錯路。這時我們獲得了一棵交錯樹(概念很重要),它的葉子結點全部是x頂點。現在我們把交錯樹中x頂點的頂標全都減小某個值d,y頂點的頂標全都增加同乙個值d,那麼我們會發現:
1.兩端都在交錯樹中的邊(i,j),a[i]+b[j]的值沒有變化。也就是說,它原來屬於相等子圖,現在仍屬於相等子圖。
2.兩端都不在交錯樹中的邊(i,j),a[i]和b[j]都沒有變化。也就是說,它原來屬於(或不屬於)相等子圖,現在仍屬於(或不屬於)相等子圖。(意思是說,對於整個圖而言,如果不屬於相等子圖,則還不屬於相等子圖,如果屬於相等子圖,因為不變,所以還屬於相等子圖)
3.x端不在交錯樹中,y端在交錯樹中的邊(i,j),它的a[i]+b[j]的值有所增大。它原來不屬於相等子圖,現在仍不屬於相等子圖。d應該等於min。
舉個簡單的例子:
已知k5,5的權矩陣為
y1 y2 y3 y4 y5
x1 3 5 5 4 1
x2 2 2 0 2 2
x3 2 4 4 1 0
x4 0 1 1 0 0
x5 1 2 1 3 3
初始化:其中k5,5的頂劃分為x=,y=,i=1,2,3,4,5.
(1)取可行頂標l(v)為
l(yi)=0,i=1,2,3,4,5;l(x1)=max(3,5,5,4,1}=5,l(x2)=max=2,l(x3)=max(2,4,4,1,0}=4,l(x4)=max=1,l(x5)=max=3.
(2) gl及其上之匹配見圖7.12。
這個圖中ο(g-x2)=3,由tutte定理知無完備匹配。需要修改頂標。
tutte定理:乙個圖g有完備匹配,其充要條件是,對於圖中任意點集u,去掉u後剩下的具有奇數個頂點的連通分量個數(記作o(g-u))不超過u中的頂點數。
當相等子圖中u=,去掉u後有三個連通分量, , ,均為奇數個頂點,故o(g-x2)=3,比u中的頂點數1大。所以相等子圖沒有完備匹配。
(3)
找交錯樹。對於x4中,交錯樹有:x1-y2-x4和x1-y2-x3-y3-x4.則需要找的d就是從在交錯樹中的x集合(1,3,4)和不在交錯樹種
的y集合(1,4,5)中去lx[i]+ly[j]-map[i][j]的最小值。得到的值為1.則x1,x2,x3,x4,x5的頂標分別修改成
4,2,3,0,3;y1,y2,y3,y4,y5的頂標分別修改成0,1,1,0,0。
修改之後發現可以進入相等子圖的邊有(x1,y4), (x4,y1), (x4,y4), (x4,y5)
然後我們在剛才基礎上繼續尋找交錯樹,我們可以發現交錯樹有多種情況:
1.x4-y4
2.x4-y5
3.x4-y1-x2-y4
4.x4-y2-x1-y4
這樣我們找到的完備匹配分別是:
1.x1-y2,x2-y1,x3-y3,x4-y4,x5-y5.
2.x1-y2,x2-y1,x3-y3,x4-y5,x5-y4.
3.x1-y2,x2-y4,x3-y3,x4-y1,x5-y5.
4.x1-y4,x2-y1,x3-y3,x4-y2,x5-y5.
對應的最大權值分別為:
1.5+2+4+0+3=14
2.5+2+4+0+3=14
3.5+2+4+0+3=14
4.4+2+4+1+3=14
(4) 用修改後的頂標l得gl及其上面的乙個完備匹配如圖7.13(第四種情況)。圖中粗實線給出了乙個最佳匹配,其最大權是4+2+4+1+3=14
以上就是km演算法的基本思路。但是樸素的實現方法,時間複雜度為o(n4)——需要找o(n)次增廣路,每次增廣最多需要修改o(n)次頂標,每次修改頂標時由於要列舉邊來求d值,複雜度為o(n2)。
實際上km演算法的複雜度是可以做到o(n3)的。我們給每個y頂點乙個「鬆弛量」函式slack,每次開始找增廣路時初始化為無窮大。在尋找增廣路的過程中,檢查邊(i,j)時,如果它不在相等子圖中,則讓slack[j]變成原值與a[i]+b[j]-w[i,j]的較小值。這樣,在修改頂標時,取所有不在交錯樹中的y頂點的slack值中的最小值作為d值即可。但還要注意一點:修改頂標後,要把所有的slack值都減去d。(else後面的是因為lx[i]變小了d
而slack[j] = min 所以slack[j](j不屬於t)受影響也要減小d)
匈牙利演算法和Kuhn Munkres演算法
內容摘自高隨祥的 圖論與網路流理論 一書 n s 或者 x 或 y 表示的是相應集合的元素的個數。n s 表示與s集合中的頂點相鄰接的頂點,例如,a b c d中,b的鄰接點就是a和c。a b c d是一條增廣路,紅色線表示屬於m匹配,黑色線表示不屬於,圖中,b,c兩點是m飽和的,a,d兩點是非m飽...
Kuhn Munkres 演算法詳細解析
直接進入正題,kuhn munkres 演算法 下文簡稱 km 演算法 是為了高效求解二分圖最佳完美匹配問題而生的,我們先溫習一下幾個概念,如果你對這幾個概念不是很熟悉的話,建議先去學習。不要被概念弄的暈了,用最直觀的方式考慮。情景是有乙個班級的學生要結成男女兩兩一組,但每個學生只想自己喜歡的異性結...
SPFA 演算法(剪輯)(學習!)
spfa演算法 單源最短路徑的演算法最常用的是dijkstra,些演算法從時間複雜度來說為o n 2 但是面對含有負權植的圖來說就無能為力了,此時 dellman ford演算法就有用了,這咱演算法是採用的是動態規化的思想,但是1994年西南交通大學段凡丁發表了spfa shortest path ...