【UOJ】#79. 一般图最大匹配
2017-01-19 23:09
316 查看
传送门http://uoj.ac/problem/79
听说带花树已经相当普及了……二分图中,匈牙利就是给图奇偶编号,不会出现同奇偶的点相连(没有奇环)
带花树就是基于匈牙利的,增加了一个处理奇环的过程的算法。搜索过程中如果发现有奇环,那么把该环再拓展一次另一种奇偶性的答案。
听说带花树已经相当普及了……二分图中,匈牙利就是给图奇偶编号,不会出现同奇偶的点相连(没有奇环)
带花树就是基于匈牙利的,增加了一个处理奇环的过程的算法。搜索过程中如果发现有奇环,那么把该环再拓展一次另一种奇偶性的答案。
#include<stdio.h> #include<algorithm> #define co(a,b) f[gf(a)]=gf(b) #define N 505 using namespace std; int f ,s ,V ,ne ,mat ,ma ,Q ,n,m,ans,tot,l,r; struct edge{int v,n;}e[N*N]; inline void push(const int &u,const int &v){e[++tot]=(edge){v,s[u]};s[u]=tot;} int gf(int x){return f[x]==x?x:f[x]=gf(f[x]);} inline int lca(int x,int y) { static int t=0; for (t++;;swap(x,y)) if (x) { x=gf(x); if (V[x]==t) return x; V[x]=t; x=ne[mat[x]]; } } inline void g(int a,int p) { while (a!=p) { int b=mat[a],c=ne[b]; if (gf(c)!=p) ne[c]=b; if (ma[b]==2) ma[Q[++r]=b]=1; co(a,b);co(b,c);a=c; } } inline void find(const int &st,const int &n) { for (int i=1;i<=n;i++) f[i]=i,ne[i]=ma[i]=V[i]=0; ma[st]=1;Q[1]=st; for (l=r=1;l<=r;l++) { int u=Q[l]; for (int i=s[u];i;i=e[i].n) { int v=e[i].v; if (mat[u]==v || gf(u)==gf(v) || ma[v]==2) continue; if (ma[v]==1) { int tmp=lca(u,v); if (gf(u)!=tmp) ne[u]=v; if (gf(v)!=tmp) ne[v]=u; g(u,tmp);g(v,tmp); } else if (!mat[v]) { ne[v]=u; for (int k=v,x,y;k;k=y) y=mat[x=ne[k]],mat[x]=k,mat[k]=x; return; } else ne[v]=u,ma[v]=2,ma[Q[++r]=mat[v]]=1; } } } int main() { scanf("%d%d",&n,&m); for (int u,v;m--;) { scanf("%d%d",&u,&v); push(u,v),push(v,u); } for (int i=1;i<=n;i++) if (!mat[i]) find(i,n); for (int i=1;i<=n;i++) if (mat[i]) ans++; printf("%d\n",ans>>1); for (int i=1;i<=n;i++) printf("%d ",mat[i]); }
相关文章推荐
- [随机] UOJ#79. 一般图最大(随机)匹配
- UOJ #79. 一般图最大匹配
- 带花树算法 UOJ#79. 一般图最大匹配
- 【UOJ】#79. 一般图最大匹配
- uoj#79. 一般图最大匹配【带花树模板】
- UOJ79 一般图最大匹配
- #79. 一般图最大匹配(带花树算法)
- uoj 79 一般图最大匹配
- UOJ 一般图的最大匹配(带花树算法模板)
- uoj #79. 一般图最大匹配 带花树算法
- UOJ-79 一般图的最大匹配(带花树模板求解)
- 【UOJ 79】 一般图最大匹配 (✿带花树开花)
- [UOJ171][WC2016]挑战NPC-一般图最大匹配
- 一般图最大匹配——带花树模板
- uoj171 bzoj4405 挑战NPC 一般图最大匹配
- 【转】带花树(一般无向图的最大匹配)
- 挑战NPC 一般图最大匹配
- 带花树(一般图最大匹配)详解 ZOJ 3316
- 【UOJ #79】一般图最大匹配 带花树模板
- hdu 3551 Hard Problem 一般图最大匹配+给出一个无向图,存在重边,没有自环。问能否删除一些边,使得每个顶点的度数为指定度数