帶花樹演算法學習筆記

2022-05-30 16:24:16 字數 1075 閱讀 5002

帶花樹演算法大概就是解決一般圖的最大匹配

回顧匈牙利演算法解決二分圖匹配

我們每次增廣左側的a,其實是找到與它有邊相連的右側的乙個點b

看b是否在匹配中,如果不在那麼增廣成功

如果在那麼就增廣b的匹配點c看是否成功

但我們發現這是因為我們把點集分成兩個內部無交的點集才可以這麼做

但是對於一般圖是不滿足這一性質的

這會導致增廣時原有的兩半邊點集可能出現內部匹配

我們需要對匈牙利演算法進行改造

看**得知

其實問題就是出在一般圖會有奇環上

我們發現二分圖是沒有奇環的所以可以直接搞

偷了張圖

這樣匈牙利就會掛掉

於是我們考慮單獨搞基奇環

考慮乙個長度為(2k+1)的奇環我們可以任意調整匹配

使得出現k對匹配和乙個孤立點向外連邊,而這個孤立點是可以隨意選取的

於是我們可以考慮把奇環縮成乙個點是等價的

使用並查集實現

事實上實現我講不清楚就貼個鏈結溜了

yyb的部落格

我的板子

把每個籃子拆成三個點,每個球向可以放入的籃子的拆出來的每個點連邊

籃子拆出來的點兩兩連邊

做一般圖匹配

這樣我們發現

乙個籃子拆出來點貢獻的總匹配數-點匹配的球個數就是我們要求的答案

於是上帶花樹板子就ok了

code

題目考慮把乙個度數為x的點拆成x個點

那麼圖中的一條邊就相當於兩端的點可以一遍選乙個匹配

兩個點拆出的點兩兩連邊即可

但是兩個點度數都是2會出問題

可能出現兩組匹配這種不合法的情況

於是我們考慮對連線兩個度數為2的邊新拆出e,e'兩個點

那麼設兩端點為x,y

則連線以下邊即可

(x,e),(x'e)

(y,e'),(y',e')

(e,e')

那麼問題轉化為判斷圖中是否存在完美匹配

跑帶花樹板子即可

code

帶花樹演算法學習筆記

難得yyb寫了乙個這麼正式的標題 q 為啥要學帶花樹這種東西啊?a 因為我太菜了,要多學點東西才能不被吊打 q 為啥要學帶花樹這種東西啊?a 因為我做自己的專題做不動了,只能先去 預習 ppl的專題了 q 為啥要學帶花樹這種東西啊?a 因為可以用來做題啊,比如某wc題目 先推薦乙個很皮很皮的帶花樹講...

帶花樹演算法學習小記

眾所周知,帶花樹演算法用來解決一般圖最大匹配問題。因為人很菜理解不清楚,所以建議對板理解。以下都是本人的感性理解,有不嚴謹的說法請包涵。同樣是找增廣路。增廣路定義為一條路徑 p 1,p 2,dots,p k 滿足 p 2,p 3 匹配,p 4,p 5 匹配 p p 匹配。p 1 和 p k 不在匹配...

帶花樹學習筆記

帶花樹是一種用於解決一般圖最大匹配的演算法 不是資料結構 一般圖與二分圖最大的不同是一般圖中存在奇環,所以不能和二分圖一樣的隨便找到一條交錯路就增廣。帶花樹的做法是把奇環縮起來 開花 讓環上的點找到乙個增廣路之後能沿著正確的方向往回退,除此之外在思路上與匈牙利差不多。具體看 的注釋 include ...