[Ural1099]工作安排 带花树
2017-05-06 07:23
239 查看
题目大意
一般图最大匹配.
题解:
求解一般图最大匹配.
直接使用带花树即可.
(带花树也是刚学)...
马上写带花树的ppt,会很通俗易懂.
(充分证明了本苣智商不够,写不出高深的课件)
如果有想要的依然可以直接私信我 QAQ
带花树模板
#include <cstdio> #include <cstring> #include <algorithm> typedef long long ll; inline void read(int &x){ x=0;char ch;bool flag = false; while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true; while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x; } #define rg register int #define rep(i,a,b) for(rg i=(a);i<=(b);++i) #define per(i,a,b) for(rg i=(a);i>=(b);--i) const int maxn = 256; int n; bool map[maxn][maxn],inq[maxn],inBlo[maxn],mark[maxn]; int link[maxn],fa[maxn],belong[maxn],q[maxn],l,r; inline void bloom(int x,int y){ rep(i,0,n) mark[i] = inBlo[i] = false; #define nx(x) fa[link[(x)]] int lca; for(rg i=x;i;i=nx(i)) mark[i = belong[i]] = true; for(rg i=y;i;i=nx(i)){ i = belong[i]; if(mark[i]){lca = i;break;} } for(rg i=x;belong[i] != lca;i=nx(i)){ if(belong[nx(i)] != lca) fa[nx(i)] = link[i]; inBlo[belong[i]] = inBlo[belong[link[i]]] = true; } for(rg i=y;belong[i] != lca;i=nx(i)){ if(belong[nx(i)] != lca) fa[nx(i)] = link[i]; inBlo[belong[i]] = inBlo[belong[link[i]]] = true; } #undef nx if(belong[x] != lca) fa[x] = y; if(belong[y] != lca) fa[y] = x; rep(i,1,n) if(inBlo[belong[i]]){ belong[i] = lca; if(!inq[i]) inq[q[++r] = i] = true; } } inline void modify(int s){ int x,y,z = s; while(z){ y = fa[z];x = link[y]; link[y] = z;link[z] = y; z = x; } } inline void bfs(int s){ rep(i,0,n){ fa[i] = inq[i] = 0; belong[i] = i; } l = 0;r = -1;q[++r] = s; inq[s] = true; while(l <= r){ int u = q[l++]; rep(v,1,n){ if(map[u][v] == 0 || belong[u] == belong[v] || link[u] == v) continue; if(s == v || link[v] && fa[link[v]]) bloom(u,v); else if(fa[v] == 0){ fa[v] = u; if(link[v] != 0){ q[++r] = link[v]; inq[link[v]] = true; }else{ modify(v); return ; } } } }return ; } int main(){ read(n);int u,v; while(scanf("%d%d",&u,&v) != EOF){ map[u][v] = map[v][u] = true; } rep(i,1,n) if(link[i] == 0) bfs(i); int ans = 0; rep(i,1,n) if(link[i] != 0) ++ ans; printf("%d\n",ans); rep(i,1,n){ if(link[i] > i) printf("%d %d\n",i,link[i]); } return 0; }
相关文章推荐
- URAL1099:Work Scheduling(任意图匹配,带花树)
- Ural 1099 Work Scheduling (一般图的最大匹配:带花树算法)
- URAL 1099 Work Scheduling(带花树)
- URAL 1099 一般图带花树匹配
- Work Scheduling URAL - 1099 一般图的最大匹配(带花树)
- URAL 1099 Work scheduling 一般图的最大匹配 带花树算法(模板)
- 一般图带花树匹配(URAL - 1099)模板
- URAL1099-Work Scheduling(一般图最大匹配(带花树))
- ural-1099-Work Scheduling(裸带花树)
- URAL 1099 Work Scheduling(一般图匹配 带花树算法)
- 新员工的工作安排
- 农村土地确权之系列文档 —— 关于数据接边工作安排的说明
- 【网易2017春季】工作安排
- 职场分享:职场中不要等着老板来给你安排工作
- [bzoj2245][SDOI2011]工作安排——费用流
- 【bzoj2245】[SDOI2011]工作安排 费用流
- 工作安排---回溯法
- 2245: [SDOI2011]工作安排
- 尼克的工作安排
- BZOJ1572: [Usaco2009 Open]工作安排Job 贪心