Kuhn Munkres演算法 剪輯 (備用)

2022-04-28 23:45:25 字數 2702 閱讀 1836

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