最大匹配、最小頂點覆蓋、最大獨立集、最小路徑覆蓋(轉)
在講述這兩個演算法之前,首先有幾個概念需要明白:
二分圖:
二分圖又稱二部圖,是圖論中的一種特殊模型。設G=(V,E)是一個無向圖,如果頂點V可以分割為兩個互不相交的子集(A,B),並且圖中的每條邊(i,j)所關聯的兩個頂點i和j分別屬於這兩個不同的頂點集(i in A, j in B), 則稱圖G是二分圖。
匹配:
給定一個二分圖,在G的一個子圖G’中,如果G’的邊集中的任意兩條邊都不依附於同一個頂點,則稱G’的邊集為G的一個匹配
最大匹配:
在所有的匹配中,邊數最多的那個匹配就是二分圖的最大匹配了
頂點覆蓋:
在頂點集合中,選取一部分頂點,這些頂點能夠把所有的邊都覆蓋了。這些點就是頂點覆蓋集
最小頂點覆蓋:
在所有的頂點覆蓋集中,頂點數最小的那個叫最小頂點集合。
獨立集:
在所有的頂點中選取一些頂點,這些頂點兩兩之間沒有連線,這些點就叫獨立集
最大獨立集:
在左右的獨立集中,頂點數最多的那個集合
路徑覆蓋:
在圖中找一些路徑,這些路徑覆蓋圖中所有的頂點,每個頂點都只與一條路徑相關聯。
最小路徑覆蓋:
在所有的路徑覆蓋中,路徑個數最小的就是最小路徑覆蓋了。
熟悉了這些概念之後,還有一個二分圖最大匹配的König定理,這個定理的內容是:最大匹配 = 最小頂點覆蓋。此處不證明其正確性。有了這個定理之後還可以得出一些二分圖特有的公式:
最大獨立集 = 頂點個數 – 最小頂點覆蓋(最大匹配)
這個公式,我們可以利用最大匹配來找到最大的獨立集。而最大獨立集和最小路徑覆蓋有個千絲萬縷的關係。
對於二分圖的最大匹配,常用的求解方法是hungarian演算法和最大流演算法。以poj上的題目為例說明:
POJ2271: 題目大意是,一群男孩和女孩共N人,某些男孩和女孩之間會發生戀愛關係(滿足一定的關係),現在希望找到最多的孩子,他們之間不會發生戀愛關係。
分析:找到最多的孩子,沒有戀愛關係,這實質上是找最大獨立集。假設男孩在左有a個,女孩在右有b個,那麼如果某男孩和某女孩之間有關係,就連線。最大獨立集就是找到最多頂點,頂點之間沒有聯絡,正好就是所求,而最大獨立集就是 N-最大匹配,所以問題得到解決。試想,如果二分圖中沒有連線,那麼所有的孩子都可選,最大獨立集也是N,他們是等價的。如果存在一條連線,那麼去掉一個孩子就是所找的孩子,最大獨立集此時是N-1.依次類推。在試想,最大匹配其實就找到了幾對戀愛物件,假設是這樣的
a b
B0 G0
B1 G1
… …
Bi Gi
… …
我們只需要把他們的另一半去掉,就是我們找的孩子。不過會有這樣的疑問,如果我取出了B1的另一半G1,B1會不會和其餘的孩子戀愛呢,比如說B1和b會戀愛,那麼好吧,去掉G1的另一半B1,這樣就不會有問題了吧。還有擔心?G1會不會和其餘的孩子戀愛呢,比如說G1和a會戀愛,不過這樣的情況是不會出現的。假如G1和a好,B1和b好,那麼最大匹配中出現的是兩條邊G1->a B1->b,而不是現在的B1和G1.所以,既然最大匹配中選擇了B1和G1,去掉他們中間的一個肯定是可行的。所以答案就是N-最大匹配了。
POJ3692:題目大意是,一群男孩B個(他們互相認識),一群女孩G個(他們互相認識),某些男孩和某些女孩相識,現在找出最多的孩子,他們互相認識
分析:這個題目和上面的有些相似。對於利用二分圖最大匹配演算法解題最重要不是匹配演算法本身,而是如何問題轉化為二分圖模型。一旦模型建立,就很容易了。題目要找的是一群孩子,他們之間都互相認識,也就是說這是一個團(圖的概念,任意兩個頂點之間都有連線)。可是如果直接去找團,可能比較麻煩。因為這是二分圖,自然要利用二分圖的性質。在二分圖的演算法裡面沒有找團的相關演算法,所以我們可以考慮反問題,找出最多的孩子,他們之間互不認識,這不是就是求最大獨立集嘛。建立這樣的二分圖,左邊是男孩,右邊是女孩,如果男孩和女孩不認識就連上邊,在這樣的二分圖中,找最大獨立集,其實就是找出所有的相互認識的孩子了。接下來就很容易了。此題說明模型的轉化和構圖很重要。
POJ3041:題目大意是,一個矩陣,某些位置有小行星,有一種炸彈,一次可以炸掉一行或者一列,現在問題是需要最少用多少這樣的炸彈。
分析:模型轉化,非常巧妙的利用二分圖來解決。利用二分圖必須有左頂點和右頂點,我們把行作為左頂點,列作為右頂點,如果該行和該列的交點有小行星,就連線。求此二分圖的最大匹配就是了。對這個問題展開思考,為什麼可以這麼轉化。其實從最小頂點覆蓋的角度來想比較好理解,左邊的頂點和右邊的頂點只有當有小行星的時候才有連線,那麼只要找到最少的頂點把所有的邊覆蓋了,那麼就是所求的解了。最小頂點覆蓋等值於最大匹配
POJ1466:題目大意是,一群人N,某人可能是多某些人有羅曼史,性別未知,但一定是異性。找出最多的同學,他們之間無羅曼史
分析:因為性別未知,所以可以把所有的人當成左頂點,右邊也是所有的人,建立二分圖,可以想象,這樣求出來的最大匹配是男女分開建立的二分圖的最大匹配的二倍。而題目讓找最大獨立集,所以應該是N-最大匹配/2;
POJ1325:題目大意是,有兩臺機器,有多個任務,每個任務都可在這兩臺機器上執行,不過不同的模式需要重啟電腦,很浪費時間,現在要找出最好的排程方式,減少排程時間。
分析:最少的頂點覆蓋最多的邊(任務),所以是最小頂點覆蓋問題
POJ2060:題目大意,有很多人預訂出租車,如果計程車做完一個任務能夠敢到下一個任務,就不需要在排程一輛計程車了,現在請問最少需要幾輛計程車。
分析:最小路徑問題,對任務構圖,將一個任務拆開成兩個點,建立二分圖,如果一個任務能夠完成之後趕到下個任務就連線,然後就是二分圖問題了。最小路徑等值於二分圖的最大獨立集
POJ2226:和3041相似,不過這裡不是銷燬一行或者一列,一次只能銷燬連著的一行或者一列。可以把所有的行連續的段拿出來作為左頂點,所有的列連續的段拿出來作為右頂點,如果左段與右段之間有相交,就連線。然後求最小頂點覆蓋
POJ1422:最小路徑覆蓋
POJ2594:特殊的最小路徑覆蓋,每個頂點可以有多條路徑經過,這時需要事先把任意兩點之間是否能夠到達求出,然後在求路徑覆蓋。
POJ1548:最小路徑覆蓋
POJ3216:最小路徑覆蓋
二分圖最小頂點覆蓋的證明
首先,回顧一下二分圖最小點覆蓋的定義:
二分圖中,選取最少的點數,使這些點和所有的邊都有關聯(把所有的邊的覆蓋),叫做最小點覆蓋。
最少點數=最大匹配數
結合昨天看的介紹,,今天按照我的理解給出自己的證明(原創,僅作參考,歡迎討論)
從最大匹配數到底能不能覆蓋所有的邊入手。
因為已知了最大匹配,所有再也不能找到增廣路了,有最大匹配定義知。
現在所有的邊就剩下兩種情況了,一種是匹配,一種是不匹配。
假設所有的匹配邊有n條,那麼左右邊就都有n個匹配邊的頂點了,標記所有左邊匹配邊的頂點,則有n個。
問題就是證明n=最小點覆蓋,即證明最大匹配數n到底能不能覆蓋所有的邊入手。
考察右邊的匹配邊的頂點,明顯,左邊都可以找到其匹配點且為n,說明所有匹配邊已經被這左邊的n個點關聯了。
接下來證明未匹配邊也能被這左邊的n個匹配的點關聯那麼不就證明了“,使這些點和所有的邊都有關聯(把所有的邊的覆蓋)”嗎。。
對於剩下的未匹配邊,每條邊都有一個右邊點(顯然既然是未匹配邊,這個點自然是未匹配點)和左邊點(我將證明著些左邊點都是匹配邊的頂點,證明了這一點,也就證明了這左邊的n個點也和剩下的未匹配邊關聯了)
假設上面說的左邊點不在這n個匹配邊的左邊點之中,那從剩下的某個未匹配邊的右邊點出發不就可以找到增廣路了嗎(想想增廣路的定義就知道了,右未匹配,左未匹配的話那就可以找到增廣路了),所以左邊點也在匹配邊之中,。所以就證明了剩下的未匹配邊關聯的範圍也在這左邊的n個匹配點的範圍內力了。
也就證明了這n個左邊匹配邊的點既也右邊匹配邊關聯,也與右邊未匹配邊關聯了,即與所有邊關聯了。
那麼按照最小覆蓋的定義,接下來只要證明這個n是做小值就行了。
假設可以比n小,那就相當於隨便刪一些匹配邊,那麼這些刪除了邊的右邊點就沒人匹配了,也就不滿足與所以邊關聯了,所以矛盾,所有n就是最小值。
故得證。
主要從最小覆蓋的定義的兩個要點(1,能不能關聯所有的邊。2,最小)來證明最大匹配的所有左邊點就滿足這個要求,匹配邊有n條那自然匹配邊的左邊點就有n個了。
轉載自:http://blog.sina.com.cn/s/blog_5ceeb9ea0100l08n.html
性質:
最大團 = 補圖的最大獨立集
最小邊覆蓋 = 二分圖最大獨立集 = |V| - 最小路徑覆蓋
最小路徑覆蓋 = |V| - 最大匹配數
最小頂點覆蓋 = 最大匹配數
最小頂點覆蓋 + 最大獨立數 = |V|
最小割 = 最小點權覆蓋集 = 點權和 - 最大點權獨立集