帶花樹用來解決一般圖的最大匹配問題。
考慮不能直接增廣的原因是存在奇環。
帶花樹的思路是把奇環給縮成一朵花。
然後仍然通過增廣路演算法實現擴大匹配數目。
其中能縮成一朵花的原因是。
一堆點縮成花之後能夠成為增廣路中的某乙個點,那麼原圖也可以。
這樣就簡化了模型從而可以直接用\(bfs\)增廣。
1.uoj79
模板題存個板子
#include#include#includeusing namespace std;
inline void read(int &x)
const int maxn=505,maxm=maxn*maxn;
int ans,n,m,tot,dex,first[maxn],mt[maxn],id[maxn],pre[maxn],yet[maxn],fat[maxn];
queueq;
struct roadeage[maxm<<1];
void add(int x,int y) ;first[x]=tot;}
void link(int x,int y)
int find(int x)
int lca(int x,int y)
}void bloss(int x,int y,int lca)
}int bfs(int s)
id[mt[t]]=0;q.push(mt[t]);
}else if(!id[t]&&find(x)!=find(t))
}} return 0;
}int main()
2.uoj171 挑戰npc
說是npc是嚇唬你的。
乙個框裡面放0或者1個點,對答案的貢獻就是1,否則是0.
那麼對每乙個框拆成三個框。
三個框互相連邊,球向三個框連邊。
可以發現最終答案就是\(max-n\)。
如果放入的是乙個或0個球,這個框的匹配-球和框的匹配就是1,否則是0.
這樣貢獻就正確了。
同時先匹配球再匹配框。
防止框匹配上了球匹配不上。
帶花樹學習筆記
帶花樹是一種用於解決一般圖最大匹配的演算法 不是資料結構 一般圖與二分圖最大的不同是一般圖中存在奇環,所以不能和二分圖一樣的隨便找到一條交錯路就增廣。帶花樹的做法是把奇環縮起來 開花 讓環上的點找到乙個增廣路之後能沿著正確的方向往回退,除此之外在思路上與匈牙利差不多。具體看 的注釋 include ...
模板 帶花樹
學習部落格 那些年我用帶花樹做過的題目 帶花樹板子 include using namespace std const int n 1200 10 int n,m,k inline intread namespace flowertree e 300 600 6 10 int head n tot ...
帶花樹總結
匈牙利演算法 二分圖最大匹配 考慮一下二分圖和一般圖的最大區別 或者說唯一的區別在 二分圖沒有奇環 也就是長度為奇數的環 而一般圖是可以有的。所以匈牙利演算法中的尋找增廣路然後路徑取反的方法在一般圖上就不適用了。主要還是要解決奇環的問題。我們發現乙個奇環裡至少有乙個點不能匹配,那就乾脆把乙個奇環縮成...