1.最大匹配裡的邊,每一條邊都需要使用頂點覆蓋,也就是說最小點覆蓋大於等於最大匹配數
2.我們任取乙個最大匹配,將在最大匹配內的點染成藍色,不在最大匹配內的點染成黑色
顯然,不可能有邊的兩個端點都是黑色,也就是說每條邊都至少有乙個藍色點.
我們只需選擇藍色點即可,考慮在每條匹配邊中只選乙個藍點。
選擇藍點的方法如下:
如果存在乙個端點與黑色點直接相連,那麼我們選擇這個藍色點,否則隨便選擇乙個點即可,這樣我們就構造了一種大小為最大匹配的最小點覆蓋。
注意如果存在下面的情況,則我們需要在1--2這條邊中同時選擇兩個藍色點來蓋住黑色點。但下面這種情況是不存在的。
1--2是匹配邊,1,2點均是藍色
3,4都是未匹配點,1-4,2-3是未匹配邊
因為如果是這樣的話,就會存在增廣路。
綜上:最小點覆蓋=最大匹配
以上構造方式是錯誤的,某老師的課件上出了錯。如下例中,選出1,2,c三個點來進行覆蓋,發現2--b這條邊蓋不住。
首先,因為最大匹配是原二分圖邊集的乙個子集,並且所有邊都不相交。
所以至少要從每條匹配邊中選出乙個端點,於是最小點覆蓋包含的點數不可能小於最大匹配包含的邊數。於是如果對任意二分圖構造一組點覆蓋,其包含的點數等於最大匹配,即可證明
備註:匹配點:匹配邊所連線的點
非匹配點:沒有被匹配邊連線的點
構造方法如下:
1:求出最大匹配
2:從左部每個非匹配點出發,再執行一次dfs找增廣路的過程(一定會失敗,也就是說走出一條長度為偶數,且非匹配邊與匹配邊交錯的路徑),標記所有訪問過的節點。下例中紅色為匹配邊,從未匹配點4出發,走出如下路徑(4---c---3---b---2)
3:取左部沒有打上標記的點,右邊打上標記的點,得到最小點覆蓋。下例中取出左部的1號點,右部的c,b兩個點。
證明其正確性,經過上述構造方法
1:左邊的非匹配點一定都被標記,因為它們是出發點。
2:右邊非匹配點一定沒有被標記,否則找到增廣路
3:匹配邊所連線的匹配點要麼都被標記,要麼都沒有被標記,因為在在找增廣路的過程中,左部匹配點只能通過右部到達(例如上例中c--3這條匹配邊,兩個點都被標記,a--1這條匹配邊,兩個點都沒有被標記)
在構造中,我們取左部沒有被標記的點,右邊被標記的點,根據上面討論可知,正好是每條匹配邊取了乙個點,於是選出來的點數等於最大匹配的邊數。(例如上例中4--c--3--b--2,我們選擇了c,b這兩個點,其對應著c-3這條匹配邊,我們選了乙個c點。
對於b-2 這條匹配邊,我們選了b點.
還有一條匹配邊a-1.這兩個點都沒有在我們所找的增廣路徑上。於是任意選乙個點就好了。
於是每條匹配邊,選乙個點出來即可
於是最小點覆蓋=最大匹配.
再來討論這種取法是否覆蓋了所有的邊
1:匹配邊一定被覆蓋,因為正好有乙個端點被取走
2:不存在連線兩個非匹配點的邊,否則就有長度為1的增廣路
3:連線左部非匹配點i,右邊匹配點j的邊,因為i是出發點,所以j一定被訪問,而我們取了右部所有被標記的點,所以這樣的邊被覆蓋
4:連線左部匹配點i,右邊非匹配點j的邊,,這樣的i一定沒有被訪問,否則再走到j就找到增廣路。而我們取了左邊所有未被標記的點,於是這樣的邊也被覆蓋。
poj 3041 最小點覆蓋 最大匹配
詳細講解 include include include includeusing namespace std int k,n int visit 55000 int tot vectorcoll 55000 原本開小runtime error了,所以就開了個大的,ac了。int from 5500...
最小點覆蓋 最大獨立集
在二分圖中,找出乙個最小的點集,使之覆蓋所有的邊,這個問題被稱為二分圖的最小點覆蓋。k nig定理 二分圖最小點覆蓋包含的點數等於這個二分圖的最大匹配數。證明 1.求出二分圖的最大匹配,定義 匹配邊為包含在最大匹配裡的邊,匹配點為與匹配邊相連的點。2.從二分圖右部的非匹配點開始,按照 非匹配邊 匹配...
最小點覆蓋
題目連線 最小點覆蓋為 在乙個二分圖中,選取最少的點可以把所有的變覆蓋,點的最少個數就是最小點覆蓋。最小點覆蓋 最大二分匹配。克魯斯卡爾演算法。關於本題 把從零開始,轉化成從一開始。起點不用加入e,因為機器的起始狀態就是1,或者加入e但是不參加計算,我採用的是第二種。include include ...