【知識小結】圖匹配相關總結

二分圖

最小路徑覆蓋

DAG最小路徑覆蓋

證明轉自

定義:在一個有向圖中,找出最少的路徑,使得這些路徑經過了所有的點。
路徑不能相交:
算法:把原圖的每個點V拆成Vx和Vy兩個點,如果有一條有向邊A->B,那麼就加邊Ax−>By。這樣就得到了一個二分圖。那麼最小路徑覆蓋=原圖的結點數-新圖的最大匹配數。
證明:一開始每個點都是獨立的爲一條路徑,總共有n條不相交路徑。我們每次在二分圖裏找一條匹配邊就相當於把兩條路徑合成了一條路徑,也就相當於路徑數減少了1。所以找到了幾條匹配邊,路徑數就減少了多少。所以有最小路徑覆蓋=原圖的結點數-新圖的最大匹配數。
因爲路徑之間不能有公共點,所以加的邊之間也不能有公共點,這就是匹配的定義。
DAG的最小可相交路徑覆蓋
算法:先用floyd求出原圖的傳遞閉包,即如果a到b有路徑,那麼就加邊a->b。然後就轉化成了最小不相交路徑覆蓋問題。
證明:爲了連通兩個點,某條路徑可能經過其它路徑的中間點。比如1->3->4,2->4->5。但是如果兩個點a和b是連通的,只不過中間需要經過其它的點,那麼可以在這兩個點之間加邊,那麼a就可以直達b,不必經過中點的,那麼就轉化成了最小不相交路徑覆蓋。

P4589 [TJOI2018]智力競賽
這道題題意很迷,最後轉換成DAG的最小可相交路徑覆蓋(先二分答案)
tricky的是我開始寫了一個不可相交的也過了

code

普通圖最小路徑覆蓋

TSP問題(哈密頓迴路一類問題)。不要試圖解決NPC!最小流是錯的
除了特殊限制,就是各種狀壓技巧了

一篇挺詳細的介紹

二分圖最小覆蓋集和最大獨立集

最小點覆蓋=最大匹配=點數-最大獨立集

匹配時貪心的使字典序最小

匈牙利按照位置從大到小做,邊從小到大for。因爲替換優先。所以正確
注意匈牙利不能加“當前弧”,for過的邊都要重新找增廣路

這道例題
code

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