匈牙利演算法其實就是一種遞迴,是由匈牙利數學家提出,該演算法的核心就是尋找增廣路經,它是一種用增廣路徑求二分圖最大匹配的演算法。
其時間複雜度為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//
輸出結果
13個重要結論:int find(intx)2
15}16}
17return0;
18 }
最小點覆蓋數:最小覆蓋要求用最少的點(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...