1. 程式人生 > >二分圖中對最小頂點覆蓋、最小邊覆蓋、最大獨立集的理解[轉]

二分圖中對最小頂點覆蓋、最小邊覆蓋、最大獨立集的理解[轉]

一次 一個 cnblogs 相交 style 個人理解 base 邊集 依然

原貼鏈接:http://blog.csdn.net/flynn_curry/article/details/52966283

僅僅用於自己理解,若有共鳴,別太吐槽就行哈~

首先是匈牙利算法的本質:(圖參考了zxy的)

技術分享

這個圖要詳細看完,那麽剛開始我想的“找小三”實際上就是遞歸找增廣路的過程,如果找到增廣路,匹配數就一定可以加一。(代碼就不上了,都是一個模板)

理解到這裏其實才只是個開始,我想解決的是最大匹配與最小頂點覆蓋數、最小邊覆蓋數、最大點獨立集之間的關系是怎麽得來的。首先是結論:

在任意圖中:(《挑戰》裏的結論)
(a)、對於不存在孤立點的圖,最大匹配+最小邊覆蓋=頂點數;


(b)、最大獨立集+最小頂點覆蓋=頂點數;
二分圖中:
(c)、最大匹配=最小頂點覆蓋。

然後是概念:(參考ACdreamer)

最大匹配:二分圖中邊集的數目最大的那個匹配;

最小頂點覆蓋:用最少的點,讓每條邊都至少和其中一個點關聯;

最小邊覆蓋:用盡量少的不相交簡單路徑覆蓋有向無環圖(DAG)G的所有頂點;

最大獨立集:在N個點的圖G中選出m個點,使這m個點兩兩之間沒有邊的點中,m的最大值。

任意圖中的np難題這裏不考慮,所以所有模型我們只考慮二分圖。這裏參考了這篇文章。

1、二分圖中最小頂點覆蓋等於最大匹配數
最小頂點覆蓋:實質是個點集,點集裏面的點能覆蓋所有的邊,最小頂點覆蓋就是滿足這個要求的點集中點數最小的那個。

證明(是我的個人理解,其實是我沒看懂別人的= =):首先,最小頂點覆蓋一定>=最大匹配,因為假設最大匹配為n,那麽我們就得到了n條互不相鄰的邊,光覆蓋這些邊就要用到n個點。(參考金海峰,按照人家的思路來,省的別人說我這是瞎蒙的)這裏事實上就可以看出最小頂點覆蓋和最大匹配的不同了,最大匹配的點一定是兩兩成對的,而最小頂點覆蓋還有相對孤立的點。註意是相對孤立,並不是他們之間肯定沒有邊,而是不屬於匹配範圍內的。那麽匹配範圍外的節點,一種就是有邊和匹配範圍內元素相連但是沒有匹配到,一種就是沒邊。

有邊的話這個邊就連在了匹配範圍內,那這個頂點覆蓋代表元素就是既可以連接上匹配元素,又可以連接到非匹配元素,相當於這個非匹配範圍內的元素被這個“特殊頂點”覆蓋,最小頂點覆蓋數並沒有增加;

那麽完全沒邊的孤立節點呢?好嘞,最小點集覆蓋目的就是要覆蓋所有的邊,既然這個節點沒有邊相連,那還要你幹毛?滾吧。這樣依然沒有影響最小頂點覆蓋數。

至此,匹配範圍外的所有節點都不可能影響到最小頂點覆蓋數,所以兩者完全相等。

2、二分圖中最小邊覆蓋=頂點數-最小頂點覆蓋(最大匹配)
最小邊覆蓋:實質是個邊集,這個集合裏的邊能覆蓋所有的點,最小邊覆蓋是滿足這個要求的所有邊集中邊數最少的一個。

這裏頂點數等於總的頂點數,是二分圖兩邊的頂點數,不是一邊。

證明:(這裏我看懂了該博客,所以直接貼上他的思路)設最大匹配數為m,總頂點數為n。為了使邊數最少,又因為一條邊最多能幹掉兩個點,所以盡量用邊幹掉兩個點。也就是取有匹配的那些邊,當然這些邊是越多越好,那就是最大匹配了,所以先用最大匹配數目的邊幹掉大多數點。剩下的解決沒有被匹配的點,就只能一條邊幹掉一個點了,設這些數目為a,顯然,2m+a=n,而最小邊覆蓋=m+a,所以最小邊覆蓋=(2m+a)-m=n-m。

3、二分圖中最大獨立集+最小頂點覆蓋(最大匹配)=頂點數

最大獨立集:實質是個點集,這個集合裏的點無論怎樣都兩兩相連不到一起,滿足這個要求的點數最少的一個。

證明:這個最好理解了,既然最小頂點覆蓋就是最大匹配的那些頂點,那麽剩下的節點就是相對孤立的點。而這些相對孤立的點兩兩肯定沒有邊(若有邊,匹配數就該加一了,也就是這兩點是匹配點),不就是最大獨立集嗎?那這樣所有的點就都考慮到了,兩者一加就變成了所有頂點數。

ps:

其實本來我是不想寫的,大家也看到這裏面好多別人的見解。但是只是想讓自己理清一下思路,至少寫了這篇不會再對那些結論一臉懵逼地用了。第一次自己這樣整理文章,如有不足請提出,我會盡量改正。

這些概念都清楚就可以去切水題了,那些題基本就改個輸入輸出= =,不過好歹水幾道高潮一下還是可以的ahhh~

二分圖中對最小頂點覆蓋、最小邊覆蓋、最大獨立集的理解[轉]