演算法筆記 6 匈牙利演算法

2021-10-17 11:29:18 字數 2648 閱讀 9107

今天我們來看乙個沒有前幾篇講的那麼常用,但是很有用的演算法:匈牙利演算法hungarian algorithm)。匈牙利演算法主要用於解決一些與二分圖匹配**有關的問題,所以我們先來了解一下二分圖。

二分圖bipartite graph)是一類特殊的,它可以被劃分為兩個部分,每個部分內的點互不相連。下圖是典型的二分圖。

可以看到,在上面的二分圖中,每條邊的端點都分別處於點集x和y中。匈牙利演算法主要用來解決兩個問題:求二分圖的最大匹配數最小點覆蓋數

這麼說起來過於抽象了,我們現在從實際問題出發。

看完上面講的,相信讀者會覺得雲裡霧裡的:這是啥?這有啥用?所以我們把這張二分圖稍微做點手腳,變成下面這樣:

現在boys和girls分別是兩個點集,裡面的點分別是男生和女生,邊表示他們之間存在「曖昧關係"。最大匹配問題相當於,假如你是紅娘,可以撮合任何一對有曖昧關係的男女,那麼你最多能成全多少對情侶?(數學表述:在二分圖中最多能找到多少條沒有公共端點的邊)

現在我們來看看匈牙利演算法是怎麼運作的:

我們從b1看起(男女平等,從女生這邊看起也是可以的),他與g2有曖昧,那我們就先暫時把他與g2連線(注意這時只是你作為乙個紅娘在紙上構想,你沒有真正行動,此時的安排都是暫時的)

來看b2,b2也喜歡g2,這時g2已經「名花有主」了(雖然只是我們設想的),那怎麼辦呢?我們倒回去看g2目前被安排的男友,是b1,b1有沒有別的選項呢?有,g4,g4還沒有被安排,那我們就給b1安排上g4。

然後b3,b3直接配上g1就好了,這沒什麼問題。至於b4,他只鍾情於g4,g4目前配的是b1。b1除了g4還可以選g2,但是呢,如果b1選了g2,g2的原配b2就沒得選了。我們繞了一大圈,發現b4只能注定單身了,可憐。(其實從來沒被考慮過的g3更可憐)

這就是匈牙利演算法的流程,至於具體實現,我們來看看**:

public

class

arithmetic6,,

,,,}

; hungarian hungarian =

newhungarian

(map)

;int hungarian1 = hungarian.

hungarian()

; system.out.

println

(hungarian1);}

static

class

hungarian

boolean

match

(int i,

int b)

}else}}

return

false;}

public

inthungarian()

}return cnt;}}

}

其實流程跟我們上面描述的是一致的。注意這裡使用了乙個遞迴的技巧,我們不斷往下遞迴,嘗試尋找合適的匹配。

另外乙個關於二分圖的問題是求最小點覆蓋:我們想找到最少的一些,使二分圖所有的邊都至少有乙個端點在這些點之中。倒過來說就是,刪除包含這些點的邊,可以刪掉所有邊。

這為什麼用匈牙利演算法可以解決呢?你如果以為我要長篇大論很久就錯了,我們只需要乙個定理:

(könig定理)

乙個二分圖中的最大匹配數等於這個圖中的最小點覆蓋數

好了,本節可以結束了,我們不是搞數學的,不需要證明(有興趣的話可以參考這篇部落格,雖然愚昧的我並沒看懂)。但是提供乙個直觀地找最小覆蓋點集的方法:看上節最後一張圖(或題圖),從左側乙個未匹配成功的點出發,走一趟匈牙利演算法的流程(即紫色的箭頭),所有左側未經過的點,和右側經過的點,即組成最小點覆蓋。(即圖中的b3、g2、g4)

--------------也希望大家給我點支援,謝謝各位大佬了!!!--------------

演算法筆記 匈牙利演算法

匈牙利演算法 從左邊的點出發不斷地搜尋,尋找增廣路,交換交替路上的路徑,來求解二分圖的最大匹配。模板 bool dfs int u return false int ans 0 mem match,1 for int i 1 i n i p3386 模板 二分圖匹配 pragma gcc optim...

匈牙利演算法

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

匈牙利演算法

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