标签:bsp pen mamicode ret include max 工作 match sizeof
参考博客:http://blog.sina.com.cn/s/blog_95ec9e7401018bga.html
https://www.cnblogs.com/owenyu/p/6858508.html
如果连出来的边是指向T型点的,就无视这个边。否则,我们找到了一个长度为奇数的环,就要进行一次“缩花”的操作!所谓缩花操作,就是把这个环缩成一个点。
下面以uoj79,给出一般图匹配模板
代码:
1 #include<cstdio> 2 #include<cctype> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int read() { 7 int x=0,f=1; 8 char c=getchar(); 9 for (;!isdigit(c);c=getchar()) if (c==‘-‘) f=-1; 10 for (;isdigit(c);c=getchar()) x=x*10+c-‘0‘; 11 return x*f; 12 } 13 const int maxn=505; 14 const int maxm=maxn*maxn*2; 15 int n,m,que[maxm],ql,qr,pre[maxn],tim=0; 16 struct edge { 17 int v,nxt; 18 } e[maxm]; 19 int h[maxn],tot=0; 20 int match[maxn],f[maxn],tp[maxn],tic[maxn]; 21 int find(int x) { 22 return f[x]==x?f[x]:f[x]=find(f[x]); 23 } 24 void add(int u,int v) { 25 e[++tot]=(edge){v,h[u]}; 26 h[u]=tot; 27 } 28 int lca(int x,int y) { 29 for (++tim;;swap(x,y)) if (x) { 30 x=find(x); 31 if (tic[x]==tim) return x; else tic[x]=tim,x=pre[match[x]]; 32 } 33 } 34 void shrink(int x,int y,int p) { 35 while (find(x)!=p) { 36 pre[x]=y,y=match[x]; 37 if (tp[y]==2) tp[y]=1,que[++qr]=y; 38 if (find(x)==x) f[x]=p; 39 if (find(y)==y) f[y]=p; 40 x=pre[y]; 41 } 42 } 43 bool aug(int s) { 44 for (int i=1;i<=n;++i) f[i]=i; 45 memset(tp,0,sizeof tp),memset(pre,0,sizeof pre); 46 tp[que[ql=qr=1]=s]=1; // 1: type A ; 2: type B 47 int t=0; 48 while (ql<=qr) { 49 int x=que[ql++]; 50 for (int i=h[x],v=e[i].v;i;i=e[i].nxt,v=e[i].v) { 51 if (find(v)==find(x) || tp[v]==2) continue; 52 if (!tp[v]) { 53 tp[v]=2,pre[v]=x; 54 if (!match[v]) { 55 for (int now=v,last,tmp;now;now=last) { 56 last=match[tmp=pre[now]]; 57 match[now]=tmp,match[tmp]=now; 58 } 59 return true; 60 } 61 tp[match[v]]=1,que[++qr]=match[v]; 62 } else if (tp[v]==1) { 63 int l=lca(x,v); 64 shrink(x,v,l); 65 shrink(v,x,l); 66 } 67 } 68 } 69 return false; 70 } 71 int main() { 72 #ifndef ONLINE_JUDGE 73 freopen("test.in","r",stdin); 74 freopen("my.out","w",stdout); 75 #endif 76 n=read(),m=read(); 77 for (int i=1;i<=m;++i) { 78 int x=read(),y=read(); 79 add(x,y),add(y,x); 80 } 81 int ans=0; 82 for (int i=1;i<=n;++i) ans+=(!match[i] && aug(i)); 83 printf("%d\n",ans); 84 for (int i=1;i<=n;++i) printf("%d ",match[i]); 85 puts(""); 86 return 0; 87 }
标签:bsp pen mamicode ret include max 工作 match sizeof
原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/11483184.html