帶花樹是一種用於解決一般圖最大匹配的演算法(不是資料結構)
一般圖與二分圖最大的不同是一般圖中存在奇環,所以不能和二分圖一樣的隨便找到一條交錯路就增廣。
帶花樹的做法是把奇環縮起來(開花),讓環上的點找到乙個增廣路之後能沿著正確的方向往回退,除此之外在思路上與匈牙利差不多。
具體看**的注釋
#include#include#includeusing namespace std;
namespace patchouli
//並查集
int get(int x)
inline int read()while(t>'9'||t<'0');
dowhile(t>='0'&&t<='9');
return a*b;
} //在bfs樹上找lca,這個是最暴力的方法,可以記錄一下depth讓跳的合理一點(不過不影響最後的複雜度)
//這個time只是乙個不用清空的vis陣列
inline int lca(int x,int y)
swap(x,y);
}} //開花
//奧妙重重的變換
//因為bfs是兩步兩步進行處理的,所以兩個點同時跳
//x一直是原來的黑點,y除了第乙個都是原來的白點
//原來只有白點會記錄pre,現在黑點也可以記錄pre,只是記錄的pre是方向的(bfs樹環上的兒子)
//原來的白點被標記為黑點,也和黑點一樣進行擴充套件
//如果是被原來的白點擴充套件出來的增廣路,會通過另乙個方向進行取反
inline void blossom(int x,int y,int z)
} //pre表示在bfs樹上的祖先
//match表示匹配的點
//vis是染色的狀態,約定0為無色,1為黑色,2為白色,最開始增廣的點是黑點
//只有黑點會進入佇列,列舉出邊
inline int bfs(int s)
vis[match[y]]=1,q.push(match[y]);
} else }}
return 0;
} int qaq()
}int main()
筆記 帶花樹
帶花樹用來解決一般圖的最大匹配問題。考慮不能直接增廣的原因是存在奇環。帶花樹的思路是把奇環給縮成一朵花。然後仍然通過增廣路演算法實現擴大匹配數目。其中能縮成一朵花的原因是。一堆點縮成花之後能夠成為增廣路中的某乙個點,那麼原圖也可以。這樣就簡化了模型從而可以直接用 bfs 增廣。1.uoj79 模板題...
帶花樹演算法學習筆記
難得yyb寫了乙個這麼正式的標題 q 為啥要學帶花樹這種東西啊?a 因為我太菜了,要多學點東西才能不被吊打 q 為啥要學帶花樹這種東西啊?a 因為我做自己的專題做不動了,只能先去 預習 ppl的專題了 q 為啥要學帶花樹這種東西啊?a 因為可以用來做題啊,比如某wc題目 先推薦乙個很皮很皮的帶花樹講...
帶花樹演算法學習筆記
帶花樹演算法大概就是解決一般圖的最大匹配 回顧匈牙利演算法解決二分圖匹配 我們每次增廣左側的a,其實是找到與它有邊相連的右側的乙個點b 看b是否在匹配中,如果不在那麼增廣成功 如果在那麼就增廣b的匹配點c看是否成功 但我們發現這是因為我們把點集分成兩個內部無交的點集才可以這麼做 但是對於一般圖是不滿...