二分圖【判定、最大匹配、最小點覆蓋、最小路徑覆蓋及例題】

一、最大匹配

//之前學完二分圖判定匹配就溜了。。。
定義:給定一個二分圖G,在G的一個子圖M中, M的邊集{E}中的任意兩條邊都不交匯於同一個結點,則稱M是一個匹配。選擇邊數最大的子圖稱爲最大匹配問題
算法:即匈牙利算法,匈牙利算法是用來求二分圖的最大匹配的,它的核心問題就是找增廣路徑。匈牙利算法的時間複雜度爲O(VE),其中V爲二分圖左邊的頂點數,E爲二分圖中邊的數目。

匈牙利算法詳解:
1、趣寫算法系列之–匈牙利算法
2、匈牙利算法 + 代碼理解

//差不多安難度排序
題目1:https://vjudge.net/problem/HDU-2063-過山車 (模板題)

題目2:https://vjudge.net/problem/HDU-3829-Cat VS Dog

題目3:https://vjudge.net/problem/HDU-4185-Oil Skimming

題目4:https://vjudge.net/problem/HDU-1281-棋盤遊戲(最開始完全沒想到和匹配有什麼關係hhh and 讓我想到了n皇后)

題目5:https://vjudge.net/problem/HDU-1045(猜一下它的建圖和例3像還是和例4像(゚∀゚〃) )

二、最小點覆蓋

定義:假如選了一個點就相當於覆蓋了以它爲端點的所有邊。最小頂點覆蓋就是選擇最少的點來覆蓋所有的邊。
定理:最小頂點覆蓋等於二分圖的最大匹配。

證明:二分圖的最小點覆蓋-定理證明

求最小點覆蓋:從右邊所有沒有匹配過的點出發,按照增廣路的“交替出現”的要求DFS。最終右邊沒有訪問過的點和左邊訪問過的點組成最小點覆蓋。

題目1:http://poj.org/problem?id=3041

三、最大獨立集

參考博客
定義: 選出一些頂點使得這些頂點兩兩不相鄰,則這些點構成的集合稱爲獨立集。找出一個包含頂點數最多的獨立集稱爲最大獨立集。
定理:最大獨立集 = 所有頂點數 - 最小頂點覆蓋 = 所有頂點數 - 最大匹配

證明:既然知道能夠覆蓋所有邊的最小點 個數,那麼去掉這些點後就是一個獨立集

題目1:https://vjudge.net/problem/HDU-4619-Warm up 2

四、最小路徑覆蓋

參考(因爲感覺他們都解釋得很好,大部分就直接搬了嘻嘻):
參考博客1
參考博客2

定義: 通俗點將,就是在一個有向圖中,找出最少的路徑,使得這些路徑經過了所有的點。
最小路徑覆蓋分爲最小不相交路徑覆蓋和最小可相交路徑覆蓋。

最小不相交路徑覆蓋:每一條路徑經過的頂點各不相同。如圖,其最小路徑覆蓋數爲3。即1->3>4,2,5。
最小可相交路徑覆蓋:每一條路徑經過的頂點可以相同。如果其最小路徑覆蓋數爲2。即1->3->4,2->3>5。

1、DAG的最小不相交路徑覆蓋
算法: 我們把每個點都拆成兩個點,分爲入點和出點,如果 u 到 v 有邊,那麼我們就讓 u 的出點連向 v 的入點 , 最後跑一下最大流或者匈牙利 算出最大匹配(入點和出點間的匹配)。答案就是 點的數目 - 最大匹配數

證明:還沒有匹配時,圖中有n條路徑(長度爲0),多一組匹配圖上就代表兩個點可以直接相連,圖中就會少一條路徑。一個點的出點可以連向很多點的出點,但匈牙利算法可以幫助我們確定連向哪個點可以獲得最大匹配。可以看例題再理解下。

題目1:https://vjudge.net/problem/HDU-1350-Taxi Cab Scheme

2、DAG的最小可相交路徑覆蓋
算法:先用floyd求出原圖的傳遞閉包,即如果a到b有路徑,那麼就加邊a->b。然後就轉化成了最小不相交路徑覆蓋問題。

證明:爲了連通兩個點,某條路徑可能經過其它路徑的中間點。比如1->3->4,2->4->5。但是如果兩個點a和b是連通的,只不過中間需要經過其它的點,那麼可以在這兩個點之間加邊,那麼a就可以直達b,不必經過中點的,那麼就轉化成了最小不相交路徑覆蓋。

二分圖判定

判斷二分圖一般用——染色法:
1、任選一個點進行染色,並從這個點開始dfs;
2、與這個點相鄰的點:(1)若還未染色,則標記爲另一種顏色;(2)若已染色且顏色與當前點相同,則返回失敗;(3)若已染色且顏色與當前點不同,則跳過此點
( 已被染色的點之前dfs過了)。

由染色法的過程可以得到一個定理:若一個無向圖中有奇數環,那麼它一定不是二分圖,反之成立。

注:
若一個無向圖中有奇數環,那麼會出現染色相鄰的情況。
在這裏插入圖片描述
奇數環:一個環中有奇數個點;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章