匈牙利演算法
基本概念:
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 直至...