一般图最大匹配 带花树算法 模板
来源:互联网 发布:centos更新python 编辑:程序博客网 时间:2024/04/30 07:58
例题:uoj #79. 一般图最大匹配
板子:
#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>#include<bitset>#include<string>#include<vector>#include<cstdio>#include<cstdlib>#include<cstring>#include<climits>#include<complex>#include<iostream>#include<algorithm>#define ll long longusing namespace std;const int maxn = 11000;const int maxm = 510000;int n,m;struct edge{ int y,nex; edge(){} edge(const int _y,const int _nex){y=_y;nex=_nex;}}a[maxm]; int len,fir[maxn];inline void ins(const int x,const int y){a[++len]=edge(y,fir[x]);fir[x]=len;}int fa[maxn];int findfa(const int x){return fa[x]==x?x:fa[x]=findfa(fa[x]);}void unit(int x,int y){fa[x=findfa(x)]=findfa(y);}int nex[maxn],spouse[maxn],mark[maxn],v[maxn],cnt;int LCA(int x,int y){ ++cnt; while(x) { v[x=findfa(x)]=cnt; x=nex[spouse[x]]; } while(y) { if(v[y=findfa(y)]==cnt) return y; y=nex[spouse[y]]; }}int q[maxn],tail;void group(int x,const int &tp){ while(x!=tp) { int b=spouse[x],c=nex[b]; if(findfa(c)!=tp) nex[c]=b; if(mark[b]==2) mark[q[++tail]=b]=1; if(mark[c]==2) mark[q[++tail]=c]=1; unit(x,b); unit(b,c); x=c; }}bool augment(const int s){ for(int i=1;i<=n;i++) mark[i]=nex[i]=0,fa[i]=i; q[tail=1]=s; for(int i=1;i<=tail;i++) { const int x=q[i]; for(int k=fir[x];k;k=a[k].nex) { const int y=a[k].y; if(spouse[y]==x) continue; if(findfa(x)==findfa(y)) continue; if(mark[y]==2) continue; if(mark[y]==0) { if(!spouse[y]) { int p1=y,p2=x; while(p1) { int z=spouse[p2]; spouse[p1]=p2; spouse[p2]=p1; p1=z,p2=nex[p1]; } return true; } else { nex[y]=x; mark[y]=2; mark[q[++tail]=spouse[y]]=1; } } else { int tp=LCA(x,y); if(findfa(x)!=tp) nex[x]=y; if(findfa(y)!=tp) nex[y]=x; group(x,tp); group(y,tp); } } } return false;}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int x,y; scanf("%d%d",&x,&y); ins(x,y); ins(y,x); } int re=0; for(int i=1;i<=n;i++) if(!spouse[i]&&augment(i)) re++; printf("%d\n",re); for(int i=1;i<=n;i++) printf("%d ",spouse[i]); return 0;}
0 0
- 一般图最大匹配 带花树算法 模板
- UOJ 一般图的最大匹配(带花树算法模板)
- [模板]带花树算法(一般图最大匹配)
- 带花树模板(一般图最大匹配)
- 带花树算法--一般图最大匹配
- 【BZOJ4405】挑战NPC 带花树模板 一般图最大匹配
- 一般图最大匹配-带花树-带注释模板
- UOJ-79 一般图的最大匹配(带花树模板求解)
- 带花树 一般图最大匹配
- 一般图最大匹配问题-带花树开花算法
- 一般图最大匹配问题-带花树开花算法
- poj 3020 一般图最大匹配 带花树开花算法
- 带花树算法 UOJ#79. 一般图最大匹配
- 带花树算法 UOJ#79. 一般图最大匹配
- #79. 一般图最大匹配(带花树算法)
- 利用带花树算法解决一般图的最大匹配
- 一般图匹配带花树模板
- 一般图匹配带花树模板
- Rotrofit的简单使用
- Codeforces Round #405 (rated, Div. 2, based on VK Cup 2017 Round 1)
- 系统时间,OSTimeGet()和OSTimeSet()
- 树莓派----03_安装QT5
- 关系运算符——三个数排序
- 一般图最大匹配 带花树算法 模板
- IntelliJ IDEA 创建 hello world Java web Maven项目从头到尾都有图有真相2017版本
- 题目1123:采药
- 安装phpredis插件出现的问题
- 剑指offer: 丑数
- 云平台仿真框架CloudSim
- 0319
- Java关键字 super和this
- V4L2采集摄像头过程中的几点细节