轉自Memento
一、二分圖最大匹配
定義:匹配是圖中一些邊的集合,且集合中任意兩條邊都沒有公共點,所有的匹配中,邊數最多的就是最大匹配。
算法:用匈牙利算法可以在O(V*E)的復雜度內求出二分圖的最大匹配,具體可以看
byvoid神犇的blog,講的很詳細,不過想真正完全證明這個算法,得去看組合數學。
二、二分圖最小點覆蓋
定義:點覆蓋是圖中一些點的集合,且對於圖中所有的邊,至少有一個端點屬於點覆蓋,點數最小的覆蓋就是最小點覆蓋。
定理:最小點覆蓋=最大匹配。
注:此處證明直接參考
二分圖中的最大匹配數等於最小點覆蓋數的證明
簡單證明:首先必然有,最小覆蓋>=最大匹配。於是只要證明不等式可以取等號,我們可在最大匹配的基礎上構造出一組點覆蓋。對右邊每一個未匹配的點進行dfs找增廣路,標記所有dfs過程中訪問到的點,左邊標記的點+右邊未標記的點就是這個圖的一個點覆蓋。因為對於任意一條邊,如果他的左邊沒標記,右邊被標記了,那么我們就可找到一條新的增廣路,所以每一條邊都至少被一個點覆蓋。再來證明:最大匹配=左邊標記的點+右邊未標記的點。對於每條匹配邊,只有一個點屬於點覆蓋。如果這條邊在dfs過程中被訪問了,那么就左端點屬於點覆蓋,右端點不屬於,否則就有左端點不屬於點覆蓋,右端點屬於點覆蓋。除此之外,不可能存在其它的點屬於最小覆蓋了,不然就必然可以找到增廣路。所以:左邊標記的點+右邊未標記的點=最大匹配,對於任意的二分圖,我們總能在最大匹配的基礎上構造出一組點數等於最大匹配的點覆蓋,所以:最小點覆蓋=最大匹配。
三、二分圖最小邊覆蓋
定義:邊覆蓋是圖中一些邊的集合,且對於圖中所有的點,至少有一條集合中的邊與其相關聯,邊數最小的覆蓋就是最小邊覆蓋。
定理:最小邊覆蓋=圖中點的個數-最大匹配。
簡單證明:先貪心的選一組最大匹配的邊加入集合,對於剩下的每個未匹配的點,隨便選一條與之關聯的邊加入集合,得到的集合就是最小邊覆蓋,所以有:最小邊覆蓋=最大匹配+圖中點的個數-2*最大匹配=圖中點的個數-最大匹配。
四、二分圖最大獨立集
定義:獨立集是圖中一些點的集合,且圖中任意兩點之間都不存在邊,點數最大的就是最大獨立集。
定理:最大獨立集=圖中點的個數-最大匹配。
簡單證明:可以這樣來理解,先把所有的點都加入集合,刪除最少的點和與其關聯的邊使得剩下的點相互之間不存在邊,我們就得到了最大獨立集。所以有:最大獨立集=圖中點的個數-最小點覆蓋=圖中點的個數-最大匹配。
五、有向無環圖最小不相交路徑覆蓋
定義:用最少的不相交路徑覆蓋所有頂點。
定理:把原圖中的每個點V拆成Vx和Vy,如果有一條有向邊A->B,那么就加邊Ax-By。這樣就得到了一個二分圖,最小路徑覆蓋=原圖的節點數-新圖最大匹配。
簡單證明:一開始每個點都獨立的為一條路徑,總共有n條不相交路徑。我們每次在二分圖里加一條邊就相當於把兩條路徑合成了一條路徑,因為路徑之間不能有公共點,所以加的邊之間也不能有公共點,這就是匹配的定義。所以有:最小路徑覆蓋=原圖的節點數-新圖最大匹配。
六、有向無環圖最小可相交路徑覆蓋
定義:用最小的可相交路徑覆蓋所有頂點。
算法:先用floyd求出原圖的傳遞閉包,即如果a到b有路,那么就加邊a->b。然后就轉化成了最小不相交路徑覆蓋問題。
七、偏序集的最大反鏈
定義:偏序集中的最大獨立集。
Dilworth定理:對於任意偏序集都有,最大獨立集(最大反鏈)=最小鏈的划分(最小不相交路徑覆蓋)。
通過Dilworth定理,我們就可以把偏序集的最大獨立集問題轉化為最小不相交路徑覆蓋問題了。
八、二分圖帶權最大匹配
定義:每個邊都有一組權值,邊權之和最大的匹配就是帶權最大匹配。
算法:KM算法,復雜度為O(V^3)。具體就不說了,網上有不少資料。
要注意的是,KM算法求的是最佳匹配,即在匹配是完備的基礎上權值之和最大。這和帶權最大匹配是不一樣的,不過我們可以加入若干條邊權為0的邊使得KM求出來的最佳匹配等於最大權匹配。具體實現的時候最好用矩陣來存圖,因為一般點的個數都是10^2級別,並且這樣默認任意兩點之間都存在邊權為0的邊,寫起來很方便。如果要求最小權匹配,我們可以用一個很大數減去每條邊的邊權。