匈牙利演算法

2021-06-01 07:12:49 字數 1179 閱讀 5511

匈牙利演算法(edmonds演算法)步聚:

(1)首先用(*)標記x中所有的非m頂點,然後交替進行步驟(2),(3)。

(2)選取乙個剛標記(用(*)或在步驟(3)中用(yi)標記)過的x中頂點,例如頂點xi,如果xi與y為同一非匹配邊的兩端點,且在本步驟中y尚未被標記過,則用(xi)去標記y中頂點y。重複步驟(2),直至對剛標記過的x中頂點全部完成一遍上述過程。

(3)選取乙個剛標記(在步驟(2)中用(xi)標記)過的y中結點,例如yi,如果yi與x為同一匹配邊的兩端點,且在本步驟中x尚未被標記過,則用(yi)去標記x中結點x。重複步驟(3),直至對剛標記過的y中結點全部完成一遍上述過程。

(2),(3)交替執行,直到下述情況之一出現為止:

(i)標記到乙個y中頂點y,它不是m頂點。這時從y出發循標記回溯,直到(*)標記的x中頂點x,我們求得一條交替鏈。設其長度為2k+1,顯然其中k條是匹配邊,k+1條是非匹配邊。

(ii)步驟(2)或(3)找不到可標記結點,而又不是情況(i)。 (4)當(2),(3)步驟中斷於情況(i),則將交替鏈中非匹配邊改為匹配邊,原匹配邊改為非匹配邊(從而得到乙個比原匹配多一條邊的新匹配),回到步驟(1),同時消除一切現有標記。(5)對一切可能,(2)和(3)步驟均中斷於情況(ii),或步驟(1)無可標記結點,演算法終止(演算法找不到交替鏈).

以上演算法說穿了,就是從二分圖中找出一條路徑來,讓路徑的起點和終點都是還沒有匹配過的點,並且路徑經過的連線是一條沒被匹配、一條已經匹配過交替出現。找到這樣的路徑後,顯然路徑裡沒被匹配的連線比已經匹配了的連線多一條,於是修改匹配圖,把路徑裡所有匹配過的連線去掉匹配關係,把沒有匹配的連線變成匹配的,這樣匹配數就比原來多1個。不斷執行上述操作,直到找不到這樣的路徑為止。 

下面給出此演算法的乙個例子:

(1) 置m = 空,對x1-x6標記(*)。

(2)找到交替鏈(x1, y1)(由標記(x1),(*)回溯得),置m = 。

(3)找到交替鏈(x2, y2)(由標記(x2),(*)回溯得),置m = 。

(4)找到交替鏈(x3, y1, x1, y4)(如圖9.4所示。圖中虛線表示非匹配邊,細實線表示交替鏈中非匹配邊,粗實線表示匹配邊),因而得m = 。

(5)找到交替鏈(x4, y3)(由標記(x4),(*)回溯得),置m = 。

(6)找到交替鏈(x5, y4, x1, y1, x3,y7)(如圖9.5所示,圖中各種線段的意義同上),因而得   m=

匈牙利演算法

匈牙利演算法用來解決二分圖的最大匹配問題。乙個典型的最大匹配問題的描述如下 乙個公司有n項工作,m個員工。每個員工能勝任n項工作中的幾項 0 n 工作。問題是,如何分配才能使得被處理的工作數最大。當然,如果公司裡人員很多,每項工作都有很多員工可以勝任,那麼使每項工作都有人處理的方案是顯而易見的。但遇...

匈牙利演算法

二分圖匹配的演算法,二分圖就是把圖上的點分成兩個互不相交的點集,而圖中的邊的端點只能分別屬於這兩個點集.二分圖的匹配,就是婚配問題,左邊的點集男性,右邊的點集女性,然後相互配對 一夫一妻 最大匹配就是讓好事最多.匈牙利演算法可以實現這個東西.匈牙利演算法怎麼實現的這個東西.這個比較多.如下 incl...

匈牙利演算法

二分圖又稱作二部圖,是圖論中的一種特殊模型。設g v,e 是乙個無向圖,如果頂點v可分割為兩個互不相交的子集 a,b 並且圖中的每條邊 i,j 所關聯的兩個頂點i和j分別屬於這兩個不同的頂點集 i in a,j in b 則稱圖g為乙個二分圖。給定乙個二分圖g,m為g邊集的乙個子集,如果m滿足當中的...