##建圖方法 https://wenku.baidu.com/view/63c1a01655270722192ef7c3.htmlhtml
##性質 http://dsqiu.iteye.com/blog/1689505 前段時間系統的學習了一下二分圖匹配,收穫仍是蠻大的,總算是把最大匹配、點覆蓋、點獨立、邊覆蓋什麼的關係搞清楚了,基本的算法和定理都會了,剩下的就是建模問題了,這個只能慢慢積累了,最後寫個小結。算法
1、二分圖最大匹配 定義:匹配是圖中一些邊的集合,且集合中任意兩條邊都沒有公共點,全部的匹配中,邊數最多的就是最大匹配。 算法:用匈牙利算法能夠在O(V*E)的複雜度內求出二分圖的最大匹配,具體能夠看byvoid神犇的blog,講的很詳細,不過想真正徹底證實這個算法,得去看組合數學。閉包
2、二分圖最小點覆蓋 定義:點覆蓋是圖中一些點的集合,且對於圖中全部的邊,至少有一個端點屬於點覆蓋,點數最小的覆蓋就是最小點覆蓋。 定理:最小點覆蓋=最大匹配。 簡單證實:首先必然有,最小覆蓋>=最大匹配。因而只要證實不等式能夠取等號,咱們可在最大匹配的基礎上構造出一組點覆蓋。對右邊每個未匹配的點進行dfs找增廣路,標記全部dfs過程當中訪問到的點,左邊標記的點+右邊未標記的點就是這個圖的一個點覆蓋。由於對於任意一條邊,若是他的左邊沒標記,右邊被標記了,那麼咱們就可找到一條新的增廣路,因此每一條邊都至少被一個點覆蓋。再來證實:最大匹配=左邊標記的點+右邊未標記的點。對於每條匹配邊,只有一個點屬於點覆蓋。若是這條邊在dfs過程當中被訪問了,那麼就左端點屬於點覆蓋,右端點不屬於,不然就有左端點不屬於點覆蓋,右端點屬於點覆蓋。除此以外,不可能存在其它的點屬於最小覆蓋了,否則就必然能夠找到增廣路。因此:左邊標記的點+右邊未標記的點=最大匹配,對於任意的二分圖,咱們總能在最大匹配的基礎上構造出一組點數等於最大匹配的點覆蓋,因此:最小點覆蓋=最大匹配。學習
3、二分圖最小邊覆蓋 定義:邊覆蓋是圖中一些邊的集合,且對於圖中全部的點,至少有一條集合中的邊與其相關聯,邊數最小的覆蓋就是最小邊覆蓋。 定理:最小邊覆蓋=圖中點的個數-最大匹配。 簡單證實:先貪心的選一組最大匹配的邊加入集合,對於剩下的每一個未匹配的點,隨便選一條與之關聯的邊加入集合,獲得的集合就是最小邊覆蓋,因此有:最小邊覆蓋=最大匹配+圖中點的個數-2*最大匹配=圖中點的個數-最大匹配。url
4、二分圖最大獨立集 定義:獨立集是圖中一些點的集合,且圖中任意兩點之間都不存在邊,點數最大的就是最大獨立集。 定理:最大獨立集=圖中點的個數-最大匹配。 簡單證實:能夠這樣來理解,先把全部的點都加入集合,刪除最少的點和與其關聯的邊使得剩下的點相互之間不存在邊,咱們就獲得了最大獨立集。因此有:最大獨立集=圖中點的個數-最小點覆蓋=圖中點的個數-最大匹配。.net
5、有向無環圖最小不相交路徑覆蓋 定義:用最少的不相交路徑覆蓋全部頂點。 定理:把原圖中的每一個點V拆成Vx和Vy,若是有一條有向邊A->B,那麼就加邊Ax-By。這樣就獲得了一個二分圖,最小路徑覆蓋=原圖的節點數-新圖最大匹配。 簡單證實:一開始每一個點都獨立的爲一條路徑,總共有n條不相交路徑。咱們每次在二分圖裏加一條邊就至關於把兩條路徑合成了一條路徑,由於路徑之間不能有公共點,因此加的邊之間也不能有公共點,這就是匹配的定義。因此有:最小路徑覆蓋=原圖的節點數-新圖最大匹配。htm
6、有向無環圖最小可相交路徑覆蓋 定義:用最小的可相交路徑覆蓋全部頂點。 算法:先用floyd求出原圖的傳遞閉包,即若是a到b有路,那麼就加邊a->b。而後就轉化成了最小不相交路徑覆蓋問題。blog
7、偏序集的最大反鏈 定義:偏序集中的最大獨立集。 Dilworth定理:對於任意偏序集都有,最大獨立集(最大反鏈)=最小鏈的劃分(最小不相交路徑覆蓋)。 經過Dilworth定理,咱們就能夠把偏序集的最大獨立集問題轉化爲最小不相交路徑覆蓋問題了。get
8、二分圖帶權最大匹配 定義:每一個邊都有一組權值,邊權之和最大的匹配就是帶權最大匹配。 算法:KM算法,複雜度爲O(V^3)。具體就不說了,網上有很多資料。 要注意的是,KM算法求的是最佳匹配,即在匹配是完備的基礎上權值之和最大。這和帶權最大匹配是不同的,不過咱們能夠加入若干條邊權爲0的邊使得KM求出來的最佳匹配等於最大權匹配。具體實現的時候最好用矩陣來存圖,由於通常點的個數都是10^2級別,而且這樣默認任意兩點之間都存在邊權爲0的邊,寫起來很方便。若是要求最小權匹配,咱們能夠用一個很大數減去每條邊的邊權。數學