/*Codevs 30,522 Divide the matrix into two batches of black and white and black and white do not intersect this constitutes the two parts of the two graph and then find the maximum match*/#include<cstdio>#include<cstring>#defineMAXN 5010using namespacestd;intN,m,k,num,head[maxn],match[maxn],ans;intg[Wuyi][Wuyi],f[maxn],color[Wuyi][Wuyi];structnode{intV,pre;} E[MAXN];intCal (intXinty) { return(X-1) *m+y;}voidADD (int from,intTo ) {num++;e[num].v=to ; E[num].pre=head[ from]; head[ from]=num;}intDfs (intu) { for(intI=head[u];i;i=e[i].pre) { intv=e[i].v; if(F[v])Continue; f[v]=1; if(match[v]==0||Dfs (Match[v])) {Match[v]=u;return 1; } } return 0;}intMain () {scanf ("%d%d%d",&n,&m,&k); for(intI=1; i<=k;i++){ intx, y; scanf ("%d%d",&x,&y); G[x][y]=1; } intCNT; for(intI=1; i<=n;i++) {CNT=i&1; for(intj=1; j<=m;j++) {CNT++; if(cnt&1) color[i][j]=1; Elsecolor[i][j]=0; } } for(intI=1; i<=n;i++) for(intj=1; j<=m;j++){ if(g[i][j]| | COLOR[I][J])Continue; if(j<m&&!g[i][j+1]) Add (Cal (I,J), Cal (i,j+1)); if(j>1&&!g[i][j-1]) Add (Cal (I,J), Cal (i,j-1)); if(i<n&&!g[i+1][J]) Add (Cal (I,J), Cal (i+1, J)); if(i>1&&!g[i-1][J]) Add (Cal (I,J), Cal (I-1, J)); } for(intI=1; i<=n;i++) for(intj=1; j<=m;j++){ if(g[i][j]| | COLOR[I][J])Continue; Memset (F,0,sizeof(f)); Ans+=Dfs (Cal (i,j)); } printf ("%d\n", ans); return 0;}
Codevs 3,052-metre binary map matching