匈牙利演算法

2022-03-01 08:17:51 字數 1381 閱讀 5932

匈牙利演算法其實就是一種遞迴,是由匈牙利數學家提出,該演算法的核心就是尋找增廣路經,它是一種用增廣路徑求二分圖最大匹配的演算法。

其時間複雜度為o(v*e),v為左邊的個數,e為右邊的個數。

這是乙個二分圖,現在求這個圖的最大匹配。

最開始的匹配會得到

1->a;  2->b;

(2)當對3進行匹配時,會發現3所對應的a和b 都已經被匹配完畢。此時為了大局著想,1和2必須為3讓位。

首先1把a讓給3,即 3->a;

此時會發現1還有可以用來對應的,於是2把b讓位給1,即1->b;

然後2呢也會有乙個與其對應的字母c,所以3->c;

(3)此時再來看4這個數字,由於他只能跟c進行匹配,所以假設4->c;

那麼1,2,3就沒有足夠的字母來與其對應,所以4並沒有能找到預期匹配的項。

所以這個二分匹配圖的最大匹配就為3

演算法實現:

1

//首先要進行初始化,將可以進行匹配的記錄下來

2void

init()3

9 }

然後就是對每個的數字進行遍歷,尋找最大匹配的數量

1

for(int i=1;i<=4;i++)2

9} 10//

輸出結果

其中該演算法的核心就是進行多次匹配的時候的「讓」了。

1

int find(intx)2

15}16}

17return0;

18 }

3個重要結論:

最小點覆蓋數:最小覆蓋要求用最少的點(x集合或y集合的都行)讓每條邊都至少就、和其中乙個點關聯。可以證明:最少的點(覆蓋數)= 最大匹配數

最小路徑覆蓋=| n | - 最大匹配數

用盡量少的不相交簡單路徑覆蓋  有向無環圖 g  的所有節點。解決此類問題可以建立乙個二分圖模型。把所有的頂點i拆分成兩個: x結點集中的i和y結點集中的 i ,如果有邊i->j ,則在二分圖中引入邊 i -> j ,設二分圖最大匹配數為 m ,則結果就是 n-m

二分圖最大獨立集 = 頂點數 - 二分圖最大匹配

在 n 個點的圖g 中選出 m 個點,使這個 m 個點兩兩之間沒有邊,求m的最大值

如果圖g 滿足二分圖條件,則可以用二分圖匹配來做,最大獨立集點數 = n - 最大匹配數

匈牙利演算法

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

匈牙利演算法

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

匈牙利演算法

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