1. 程式人生 > >小結一下和二分圖匹配有關的知識

小結一下和二分圖匹配有關的知識

今天考了DAG的最大獨立集,然後我精神AC掛機去了~~~

下午一覺醒來才發現我並不會求DAG最大獨立集的方案數。。。。於是乎滾去翻書,發現我概念記得一塌糊塗QWQ

(這個是一個伏筆,因為DAG根本沒有什麼最大獨立集)

 

1、König定理:最小覆蓋=最大匹配

所謂最小覆蓋是指用最少的點,覆蓋所有的邊

方案:再一次讓左側非匹配點去尋找增廣路(一定會失敗),沿途標記經過的點,輸出左側的非標記點,以及右側標記點

方案正確性:左側非匹配點一定被標記(它是起始點),右側非匹配點一定沒被標記(否則就會找到增廣路了),我們不會輸出他們。那麼當右側的匹配點被訪問,它一定會連帶匹配自己的那個左側點一起被訪問,反之兩個都不會被訪問到,所以要麼輸出左側非標記點的時候把這條匹配邊的左側點輸出,要麼輸出右側標記點的時候把這條匹配邊的右側點輸出

定理的正確性:顯然匹配邊一定被覆蓋了,討論一下非匹配邊的兩端是否總有1個被覆蓋。在再一次找增廣路的過程中,假如我們找到了這條邊的左側點並標記,那麼它的右測點也將被嘗試並標記,從而這兩點延伸到兩邊四個點均被標記了,那麼在最後這兩條邊都會選擇右側點,這條邊的右側點會覆蓋它。反之如果沒有標記,相似的會被左側覆蓋。

 

2、最大團=補圖的最大獨立集(易證)

最大團是指在給定的圖中選1個最大的點集,這個點集中的點兩兩間都有邊(也就是一個完全圖)

最大獨立集是指在給定的圖中選1個最大的點集,這個點集中的點兩兩間都沒有邊(恰恰相反)

然而,對於一般圖的最大獨立集和最大團沒有多項式時間內的方法。對於最大團,據瞭解模擬退火的解法效率較高,不過在此不再贅述。瞎正經什麼啊不會就直說嘛

還是把注意力集中在二分圖上。

二分圖的最大獨立集=n-最小覆蓋

注意:二分圖同一個集合的點相互之間均視為有邊

證明:我們要選出最多的點,讓它們相互沒有邊。也就是刪掉最少的點,同時把它們連線的邊刪掉,要把所有的邊刪掉——這就是最小覆蓋

方案:最小覆蓋選出來的點就是要刪掉的,保留下來的就是答案。

 

3、Dilworth定理:在DAG圖中 最小鏈覆蓋(也叫最小可相交路徑覆蓋)=最長反鏈

鏈是一個集合,集合裡的兩點u,v要麼u可達v,要麼v可達u(也就是圖上的一條路徑上所有點的集合)

反鏈也是一個集合,集合裡的兩點u,v,u不可達v,v也不可達u(經過多個點的路徑也算到達

最小鏈覆蓋是指用最少的鏈覆蓋整個圖,一個點可以經過多次,而最小不可相交覆蓋一個點只能經過1次

最長反鏈就是反鏈裡面最大的。

先處理求最小可/不可相交路徑覆蓋

做法:對於最小不可相交覆蓋,把點拆成入點和出點,出點連向入點(假如圖上兩點有邊的話),答案是n-最大匹配,對於最小可相交路徑覆蓋,在二分圖匹配之間需要傳遞閉包。

正確性:一次成功的匹配,相當於這兩個點可以在一條鏈被覆蓋。點的入邊和出邊可以理解成有一條虛邊(聯想網路流的拆點)跑完以後,我們可以看出一個虛實結合的路徑(建議畫圖),這個就是覆蓋原圖的一條鏈。而最小可相交路徑覆蓋需要傳遞閉包,是因為1個點在二分圖上只能匹配和被匹配各1次。

方案:按照圖中把路線弄出來就可以了。

接下來我們處理最長反鏈

證明:首先明顯有最長反鏈<=最小鏈覆蓋,因為每條鏈最多也只能選1個點。那我們只需要構造出一種方案使得最長反鏈=最小鏈覆蓋就可以了。直接看方案

方案:找到每一條鏈的終點,也就是出點(預設為左側)中的非匹配點,作為一種備選方案。我們處理出每個點下一步能到達那些點,假如備選方案裡的點在這個點集裡,那麼讓這個點往前跳直到找到一個點使得它不在這個點集,並且更新。全部處理完了以後,作為一種新的備選方案,再次驗證是否有兩點可以互相到達。

正確性:反證法:我們往前跳假如找不到不在下一步會到達的點組成的點集裡,說明這個點所屬的路徑上的所有點都可以被某其他路徑上的終點到達。對於這條路徑的起點也是如此,那麼到達這個起點的另一個終點就可以把兩條鏈連線起來,使得路徑覆蓋數少1,和路徑覆蓋數是最小的矛盾。