二分图常用建图方法及其性质
建圖方法
https://wenku.baidu.com/view/63c1a01655270722192ef7c3.html
性質(zhì)
http://dsqiu.iteye.com/blog/1689505
前段時(shí)間系統(tǒng)的學(xué)習(xí)了一下二分圖匹配,收獲還是蠻大的,總算是把最大匹配、點(diǎn)覆蓋、點(diǎn)獨(dú)立、邊覆蓋什么的關(guān)系搞清楚了,基本的算法和定理都會(huì)了,剩下的就是建模問(wèn)題了,這個(gè)只能慢慢積累了,最后寫個(gè)小結(jié)。
一、二分圖最大匹配
定義:匹配是圖中一些邊的集合,且集合中任意兩條邊都沒(méi)有公共點(diǎn),所有的匹配中,邊數(shù)最多的就是最大匹配。
算法:用匈牙利算法可以在O(V*E)的復(fù)雜度內(nèi)求出二分圖的最大匹配,具體可以看byvoid神犇的blog,講的很詳細(xì),不過(guò)想真正完全證明這個(gè)算法,得去看組合數(shù)學(xué)。
二、二分圖最小點(diǎn)覆蓋
定義:點(diǎn)覆蓋是圖中一些點(diǎn)的集合,且對(duì)于圖中所有的邊,至少有一個(gè)端點(diǎn)屬于點(diǎn)覆蓋,點(diǎn)數(shù)最小的覆蓋就是最小點(diǎn)覆蓋。
定理:最小點(diǎn)覆蓋=最大匹配。
簡(jiǎn)單證明:首先必然有,最小覆蓋>=最大匹配。于是只要證明不等式可以取等號(hào),我們可在最大匹配的基礎(chǔ)上構(gòu)造出一組點(diǎn)覆蓋。對(duì)右邊每一個(gè)未匹配的點(diǎn)進(jìn)行dfs找增廣路,標(biāo)記所有dfs過(guò)程中訪問(wèn)到的點(diǎn),左邊標(biāo)記的點(diǎn)+右邊未標(biāo)記的點(diǎn)就是這個(gè)圖的一個(gè)點(diǎn)覆蓋。因?yàn)閷?duì)于任意一條邊,如果他的左邊沒(méi)標(biāo)記,右邊被標(biāo)記了,那么我們就可找到一條新的增廣路,所以每一條邊都至少被一個(gè)點(diǎn)覆蓋。再來(lái)證明:最大匹配=左邊標(biāo)記的點(diǎn)+右邊未標(biāo)記的點(diǎn)。對(duì)于每條匹配邊,只有一個(gè)點(diǎn)屬于點(diǎn)覆蓋。如果這條邊在dfs過(guò)程中被訪問(wèn)了,那么就左端點(diǎn)屬于點(diǎn)覆蓋,右端點(diǎn)不屬于,否則就有左端點(diǎn)不屬于點(diǎn)覆蓋,右端點(diǎn)屬于點(diǎn)覆蓋。除此之外,不可能存在其它的點(diǎn)屬于最小覆蓋了,不然就必然可以找到增廣路。所以:左邊標(biāo)記的點(diǎn)+右邊未標(biāo)記的點(diǎn)=最大匹配,對(duì)于任意的二分圖,我們總能在最大匹配的基礎(chǔ)上構(gòu)造出一組點(diǎn)數(shù)等于最大匹配的點(diǎn)覆蓋,所以:最小點(diǎn)覆蓋=最大匹配。
三、二分圖最小邊覆蓋
定義:邊覆蓋是圖中一些邊的集合,且對(duì)于圖中所有的點(diǎn),至少有一條集合中的邊與其相關(guān)聯(lián),邊數(shù)最小的覆蓋就是最小邊覆蓋。
定理:最小邊覆蓋=圖中點(diǎn)的個(gè)數(shù)-最大匹配。
簡(jiǎn)單證明:先貪心的選一組最大匹配的邊加入集合,對(duì)于剩下的每個(gè)未匹配的點(diǎn),隨便選一條與之關(guān)聯(lián)的邊加入集合,得到的集合就是最小邊覆蓋,所以有:最小邊覆蓋=最大匹配+圖中點(diǎn)的個(gè)數(shù)-2*最大匹配=圖中點(diǎn)的個(gè)數(shù)-最大匹配。
四、二分圖最大獨(dú)立集
定義:獨(dú)立集是圖中一些點(diǎn)的集合,且圖中任意兩點(diǎn)之間都不存在邊,點(diǎn)數(shù)最大的就是最大獨(dú)立集。
定理:最大獨(dú)立集=圖中點(diǎn)的個(gè)數(shù)-最大匹配。
簡(jiǎn)單證明:可以這樣來(lái)理解,先把所有的點(diǎn)都加入集合,刪除最少的點(diǎn)和與其關(guān)聯(lián)的邊使得剩下的點(diǎn)相互之間不存在邊,我們就得到了最大獨(dú)立集。所以有:最大獨(dú)立集=圖中點(diǎn)的個(gè)數(shù)-最小點(diǎn)覆蓋=圖中點(diǎn)的個(gè)數(shù)-最大匹配。
五、有向無(wú)環(huán)圖最小不相交路徑覆蓋
定義:用最少的不相交路徑覆蓋所有頂點(diǎn)。
定理:把原圖中的每個(gè)點(diǎn)V拆成Vx和Vy,如果有一條有向邊A->B,那么就加邊Ax-By。這樣就得到了一個(gè)二分圖,最小路徑覆蓋=原圖的節(jié)點(diǎn)數(shù)-新圖最大匹配。
簡(jiǎn)單證明:一開(kāi)始每個(gè)點(diǎn)都獨(dú)立的為一條路徑,總共有n條不相交路徑。我們每次在二分圖里加一條邊就相當(dāng)于把兩條路徑合成了一條路徑,因?yàn)槁窂街g不能有公共點(diǎn),所以加的邊之間也不能有公共點(diǎn),這就是匹配的定義。所以有:最小路徑覆蓋=原圖的節(jié)點(diǎn)數(shù)-新圖最大匹配。
六、有向無(wú)環(huán)圖最小可相交路徑覆蓋
定義:用最小的可相交路徑覆蓋所有頂點(diǎn)。
算法:先用floyd求出原圖的傳遞閉包,即如果a到b有路,那么就加邊a->b。然后就轉(zhuǎn)化成了最小不相交路徑覆蓋問(wèn)題。
七、偏序集的最大反鏈
定義:偏序集中的最大獨(dú)立集。
Dilworth定理:對(duì)于任意偏序集都有,最大獨(dú)立集(最大反鏈)=最小鏈的劃分(最小不相交路徑覆蓋)。
通過(guò)Dilworth定理,我們就可以把偏序集的最大獨(dú)立集問(wèn)題轉(zhuǎn)化為最小不相交路徑覆蓋問(wèn)題了。
八、二分圖帶權(quán)最大匹配
定義:每個(gè)邊都有一組權(quán)值,邊權(quán)之和最大的匹配就是帶權(quán)最大匹配。
算法:KM算法,復(fù)雜度為O(V^3)。具體就不說(shuō)了,網(wǎng)上有不少資料。
要注意的是,KM算法求的是最佳匹配,即在匹配是完備的基礎(chǔ)上權(quán)值之和最大。這和帶權(quán)最大匹配是不一樣的,不過(guò)我們可以加入若干條邊權(quán)為0的邊使得KM求出來(lái)的最佳匹配等于最大權(quán)匹配。具體實(shí)現(xiàn)的時(shí)候最好用矩陣來(lái)存圖,因?yàn)橐话泓c(diǎn)的個(gè)數(shù)都是10^2級(jí)別,并且這樣默認(rèn)任意兩點(diǎn)之間都存在邊權(quán)為0的邊,寫起來(lái)很方便。如果要求最小權(quán)匹配,我們可以用一個(gè)很大數(shù)減去每條邊的邊權(quán)。
轉(zhuǎn)載于:https://www.cnblogs.com/Mr-WolframsMgcBox/p/8275958.html
總結(jié)
以上是生活随笔為你收集整理的二分图常用建图方法及其性质的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 工单组件增强
- 下一篇: [ZJOI2008]瞭望塔