1. 程式人生 > >【每日演算法】【圖論】【最小邊覆蓋 & 最小路徑覆蓋 & 最小頂點覆蓋 & 最大獨立集 & 最大團】

【每日演算法】【圖論】【最小邊覆蓋 & 最小路徑覆蓋 & 最小頂點覆蓋 & 最大獨立集 & 最大團】

最小邊覆蓋 = 最大獨立集 = |V| - 最大匹配數 這個是在原圖是二分圖上進行的 最小路徑覆蓋和最小邊覆蓋不同,不要求給的圖是二分圖,而是要求是N x N的有向圖,不能有環,然後根據原圖構造二分圖,構造方法是將點一分為二,如,i分為i1和i2然後如果i和j有邊,那麼就在i1和j2之間連一條邊。由此構成二分圖 然後最小路徑覆蓋 = n-m,n為原圖的點的個數,m為新造二分圖的最大匹配。證明也是特別簡單的,根據定義最小路徑覆蓋裡要求同一個點只可以屬於一條路徑,即路徑時不可以開叉的,如果在二分圖裡選兩條有公共點的邊那麼反應在原圖上就是路徑有岔路了,所以二分圖裡選的邊必須是無公共交點的,這就是轉化到最大匹配了。

總結:

【無向圖的最大獨立數】: 從V個頂點中選出k個頂,使得這k個頂互不相鄰。 那麼最大的k就是這個圖的最大獨立數。

【無向圖的最大團】:  從V個頂點選出k個頂,使得這k個頂構成一個完全圖,即該子圖任意兩個頂都有直接的邊。

【最小路徑覆蓋(原圖不一定是二分圖,但必須是有向圖,拆點構造二分圖)】:在圖中找一些路徑,使之覆蓋了圖中的所有頂點,且任何一個頂點有且只有一條路徑與之關聯。最小路徑覆蓋 = |V| - 最大匹配數

【最小邊覆蓋(原圖是二分圖)】:在圖中找一些邊,使之覆蓋了圖中所有頂點,且任何一個頂點有且只有一條邊與之關聯。最小邊覆蓋 = 最大獨立集 = |V| - 最大匹配數

【最小頂點覆蓋】:用最少的點(左右兩邊集合的點)讓每條邊都至少和其中一個點關聯。

PS: 原來學二分匹配時就整理過這些數字,他們之間關係是很多。如: 最小覆蓋數+最大獨立數 = 頂點數。 雖然求出他們都是np問題。但對於特殊的圖還是有好的演算法的,如:

在二分圖中,最小覆蓋數 等於 最大匹配數,而最大獨立數又等於頂點數減去最小覆蓋數(=最大匹配數),所以可以利用匈牙利求出最大獨立數等等。

a.點覆蓋集:無向圖G的一個點集,使得該圖中所有邊都至少有一點端點在該集合內。

b.點獨立集:無向圖G的一個點集,使得任兩個在該集合中的點在原圖中不相鄰。

c.最小點覆蓋集:無向圖G中點數最少的點覆蓋集

d.最大點獨立集:無向圖G中,點數最多的點獨立集

e.最小點權覆蓋集:帶點權的無向圖中,點權之和最小的點覆蓋集

f.最大點權獨立集:實在帶點權無向圖中,點權之和最大的點獨立集

性質:

最大團 = 補圖的最大獨立集

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

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

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

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

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