匈牙利演算法的學習

2021-06-16 10:00:54 字數 1852 閱讀 8201

匈牙利演算法

基本概念:

1、 交錯路:設p是圖g

的一條路,如果

p的任意兩條相鄰的邊一條是屬於匹配

m的,另外一條不屬於匹配

m,就稱

p是一條交錯路。

2、 可增廣路:兩個端點都是非飽和點的交錯路叫做可增廣路。

3、 非飽和點

:設vi是圖g

的乙個頂點,如果

vi 不與任意一條屬於匹配

m的邊相關聯,就稱

vi 是乙個

非飽和點。

演算法:1、 

首先假設二分圖兩部分一部分頂點為,另外一部分頂點為。從出發,找乙個非飽和點。放入集合s

中。同時將的在圖中相鄰的點找到,放入集合n(s

)中。

如圖,是乙個非飽和點。將放入s

中,同時與相鄰的點有,。放入n(s

)中。

2、 在n(s

)中任取乙個點。我們這兒取。已經是飽和了的,不是非飽和點。是屬於匹配m

(圖中紅線是初始匹配m,

m=)的。將加入集合t

,加入結合s

。形成新的集合。

3、 如圖,n(s

)相應的進行了變化。我們在從n(

s)中取乙個與相鄰的點,我們取。發現,也是乙個飽和點。於是重複上面的第二步。直到所取的點不是飽和點為止。

4、 如上圖,n(s

)沒有變化。我們再選中乙個點,。發現是乙個沒飽和點。可以進行改進。線路。這是一條交錯路,同時也是一條可增廣路。對它改進。

5、 將p1

中屬於匹配

m的和不屬於匹配

m的互換(這個操作稱之為增廣路徑的取反,一旦取反,新的匹配數就比原來的匹配數增加了

1個)。這樣,得到上圖。

6、 重新找到乙個未蓋點。重複上述步驟。一直到不存在未蓋點。後續的步驟我用形式給出。

當然,這只是一種可能的情況,也有可能直接我們在第一步就選擇了,沒有選擇,那麼可能會更加簡單。

遵循這個流程:

參考文獻:

後續的演算法:

網路上有很多關於這類的演算法,這兒不在提出。但是我列出了幾個部落格,他們的對於匈牙利演算法的講解比較清楚明白的。文章的圖形也是摘自他們中的一篇。只是寫出了我自己的一些看法。想要深入學習,可以到上面的**去看看。

學習 匈牙利演算法

匈牙利演算法用於二分圖的最大匹配,為一種增廣路演算法。簡言之,就是不斷妥協。安利一篇極好的blog趣寫演算法系列之 匈牙利演算法,網上的其他關於匈牙利演算法的講解,大都與這篇blog大同小異。鄰接矩陣 最壞為o n 鄰接表 o mn 以下 以洛谷p2055 zjoi2009 假期的宿舍為例 incl...

模板 學習 匈牙利演算法

一直也沒有打過,所以對匈牙利演算法的認識一直停留在社會主義分老婆上 直接帖板子啦qwq隨手一搜匈牙利演算法講解都很好一定要有圖的那種,一般左邊是漢子右邊是妹子最後乙個是鳳姐 是和 高階指南 上學的,但我用的鄰接表存圖qwq 1 include2 include3 include4 using nam...

匈牙利演算法

匈牙利演算法 edmonds演算法 步聚 1 首先用 標記x中所有的非m頂點,然後交替進行步驟 2 3 2 選取乙個剛標記 用 或在步驟 3 中用 yi 標記 過的x中頂點,例如頂點xi,如果xi與y為同一非匹配邊的兩端點,且在本步驟中y尚未被標記過,則用 xi 去標記y中頂點y。重複步驟 2 直至...