【轉http://www.cppblog.com/abilitytao/archive/2009/09/02/95147.html -> http://yejingx.ycool.com/post.2801156.html;http://hi.baidu.com/cjhh314/blog/item/ded8d31f15d7510c304e1591.html】html
二分圖最小覆蓋的Konig定理及其證實算法
1、定義post
二分圖:spa
頂點能夠分類兩個集合X和Y,全部的邊關聯在兩個頂點中,剛好一個屬於集合X,另外一個屬於集合Y。htm
最小覆蓋:blog
最小覆蓋要求用最少的點(X集合或Y集合的都行)讓每條邊都至少和其中一個點關聯。能夠證實:最少的點(即覆蓋數)=最大匹配數it
Konig定理:
二分圖的最小頂點覆蓋數等於最大匹配數。im
二:證實d3
爲主便敘述,假設G分爲左邊X和右邊Y兩個互不相交的點集。。。。。。集合
假設G通過匈牙利算法後找到一個最大匹配M,則可知G中再也找不到一條增廣路徑。
標記右邊未匹配邊的頂點,並從右邊未匹配邊的頂點出發,按照邊:未匹配->匹配->未匹配...,的原則標記途中通過的頂點,則最後一條通過的邊一定爲匹配邊。重複上述過程,直到右邊再也不含有未匹配邊的點。
記獲得的左邊已標記的點和右邊未標記的點爲S, 如下證實S即爲所求的最小頂點集。
一、| S | == M
顯然,左邊標記的點全都爲匹配邊的頂點,右邊未標記的點也爲匹配邊的頂點。所以,咱們獲得的點與匹配邊一一對應。
二、S能覆蓋G中全部的邊。
上途S中點所獲得的邊有如下幾種狀況:
(1)左右均標記;
(2)左右均無標記;
(3)左邊標記,右邊未標記;
若存在一條邊e不屬於S所覆蓋的邊集,則e 左邊未標記右邊標記。
若是e不屬於匹配邊,那麼左端點就能夠經過這條邊到達(從而獲得標記);若是e屬於匹配邊,那麼右端點不多是一條路徑的起點,因而它的標記只能是從這條邊的左端點過來的左端點就應該有標記。
三、S是最小的覆蓋。
由於要覆蓋這M條匹配邊至少就須要M個點。
3、性質
在一個PXP的有向圖中,路徑覆蓋就是在圖中找一些路經,使之覆蓋了圖中的全部頂點,且任何一個頂點有且只有一條路徑與之關聯;(若是把這些路徑中的每條路徑從它的起始點走到它的終點,那麼剛好能夠通過圖中的每一個頂點一次且僅一次);若是不考慮圖中存在迴路,那麼往往條路徑就是一個弱連通子集.
由上面能夠得出:
1.一個單獨的頂點是一條路徑;
2.若是存在一路徑p1,p2,......pk,其中p1 爲起點,pk爲終點,那麼在覆蓋圖中,頂點p1,p2,......pk再也不與其它的頂點之間存在有向邊.
最小路徑覆蓋就是找出最小的路徑條數,使之成爲P的一個路徑覆蓋.
路徑覆蓋與二分圖匹配的關係:
最小路徑覆蓋=|P|-最大匹配數;
其中最大匹配數的求法是把P中的每一個頂點pi分紅兩個頂點pi'與pi'',若是在p中存在一條pi到pj的邊,那麼在二分圖P'中就有一條鏈接pi'與pj''的無向邊;這裏pi' 就是p中pi的出邊,pj''就是p中pj 的一條入邊;
對於公式:最小路徑覆蓋=|P|-最大匹配數;能夠這麼來理解;
若是匹配數爲零,那麼P中不存在有向邊,因而顯然有:
最小路徑覆蓋=|P|-最大匹配數=|P|-0=|P|;即P的最小路徑覆蓋數爲|P|;
P'中不在於匹配邊時,路徑覆蓋數爲|P|;
若是在P'中增長一條匹配邊pi'-->pj'',那麼在圖P的路徑覆蓋中就存在一條由pi鏈接pj的邊,也就是說pi與pj 在一條路徑上,因而路徑覆蓋數就能夠減小一個;
如此繼續增長匹配邊,每增長一條,路徑覆蓋數就減小一條;直到匹配邊不能繼續增長時,路徑覆蓋數也不能再減小了,此時就有了前面的公式;可是這裏只 是說話了每條匹配邊對應於路徑覆蓋中的一條路徑上的一條鏈接兩個點之間的有向邊;下面來講明一個路徑覆蓋中的每條鏈接兩個頂點之間的有向邊對應於一條匹配 邊;
與前面相似,對於路徑覆蓋中的每條鏈接兩個頂點之間的每條有向邊pi--->pj,咱們能夠在匹配圖中對應作一條鏈接pi'與pj''的邊, 顯然這樣作出來圖的是一個匹配圖(這一點用反證法很容易證實,若是獲得的圖不是一個匹配圖,那麼這個圖中一定存在這樣兩條邊 pi'---pj'' 及 pi' ----pk'',(j!=k),那麼在路徑覆蓋圖中就存在了兩條邊pi-->pj, pi--->pk ,那邊從pi出發的路徑就不止一條了,這與路徑覆蓋圖是矛盾的;還有另一種狀況就是存在pi'---pj'',pk'---pj'',這種狀況也相似可證);
至此,就說明了匹配邊與路徑覆蓋圖中鏈接兩頂點之間邊的一一對應關係,那麼也就說明了前面的公式成立!