最大匹配、最小頂點覆蓋、最大獨立集、最小路徑覆蓋(轉)(再轉)

Euan?發表於2024-08-08

在講述這兩個演算法之前,首先有幾個概念需要明白:

二分圖:
二分圖又稱二部圖,是圖論中的一種特殊模型。設G=(V,E)是一個無向圖,如果頂點V可以分割為兩個互不相交的子集(A,B),並且圖中的每條邊(i,j)所關聯的兩個頂點i和j分別屬於這兩個不同的頂點集(i in A, j in B), 則稱圖G是二分圖。

匹配:
給定一個二分圖,在G的一個子圖G’中,如果G’的邊集中的任意兩條邊都不依附於同一個頂點,則稱G’的邊集為G的一個匹配

最大匹配:
在所有的匹配中,邊數最多的那個匹配就是二分圖的最大匹配了

頂點覆蓋:
在頂點集合中,選取一部分頂點,這些頂點能夠把所有的邊都覆蓋了。這些點就是頂點覆蓋集

最小頂點覆蓋:
在所有的頂點覆蓋集中,頂點數最小的那個叫最小頂點集合。

獨立集:
在所有的頂點中選取一些頂點,這些頂點兩兩之間沒有連線,這些點就叫獨立集

最大獨立集:
在左右的獨立集中,頂點數最多的那個集合

路徑覆蓋:
在圖中找一些路徑,這些路徑覆蓋圖中所有的頂點,每個頂點都只與一條路徑相關聯。

最小路徑覆蓋:
在所有的路徑覆蓋中,路徑個數最小的就是最小路徑覆蓋了。

熟悉了這些概念之後,還有一個二分圖最大匹配的König定理,這個定理的內容是:最大匹配 = 最小頂點覆蓋。此處不證明其正確性。有了這個定理之後還可以得出一些二分圖特有的公式:

最大獨立集 = 頂點個數 – 最小頂點覆蓋(最大匹配)
這個公式,我們可以利用最大匹配來找到最大的獨立集。而最大獨立集和最小路徑覆蓋有個千絲萬縷的關係。
對於二分圖的最大匹配,常用的求解方法是匈牙利演算法和最大流演算法。以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:最小路徑覆蓋

轉載自:http://blog.sina.com.cn/s/blog_5ceeb9ea0100l08n.html
再轉載自:https://www.cnblogs.com/wd-one/p/4547616.html

性質:
最大團 = 補圖的最大獨立集

最小邊覆蓋 = 二分圖最大獨立集 = |V| - 最小路徑覆蓋

最小路徑覆蓋 = |V| - 最大匹配數

最小頂點覆蓋 = 最大匹配數

最小頂點覆蓋 + 最大獨立數 = |V|

最小割 = 最小點權覆蓋集 = 點權和 - 最大點權獨立集

相關文章