hdu 1507 (最大匹配)

来源:互联网 发布:知豆汽车官网 编辑:程序博客网 时间:2024/05/16 07:59

求能出售多少个1*2的矩形,,将原图染色,(i+j)%2==0的染白色,其余为黑色,

求白色跟黑色的最大匹配






#include<stdio.h>#include<string.h>int n,m,ma[105][105],mark[105][105];int dir[4][2]={-1,0, 0,-1, 1,0, 0,1};struct linky{    int x;    int y;}link[105][105];int pd(int x,int y){    if(x>=1&&x<=n&&y>=1&&y<=m)        return 1;    return 0;}int find(int x,int y){    int i,a,b;    for(i=0;i<4;i++)    {        a=x+dir[i][0];        b=y+dir[i][1];        if(pd(a,b)&&ma[a][b]==0&&mark[a][b]==0)        {            mark[a][b]=1;            if(link[a][b].x==0||find(link[a][b].x,link[a][b].y)==1)            {                link[a][b].x=x;                link[a][b].y=y;                return 1;            }        }    }    return 0;}int main(){    int i,t,x,y,sum,j,temp=0;    while(scanf("%d%d",&n,&m),m&&n)    {        sum=0;        memset(ma,0,sizeof(ma));        memset(link,0,sizeof(link));        scanf("%d",&t);        for(i=1;i<=t;i++)        {            scanf("%d%d",&x,&y);             ma[x][y]=1;        }        for(i=1;i<=n;i++)            for(j=1;j<=m;j++)            {                if(ma[i][j]==0&&(i+j)%2==0)//(i+j)/2对原图染色,不同颜色间匹配                {                    memset(mark,0,sizeof(mark));                      sum=sum+find(i,j);                }            }            if(temp++>0)                printf("\n");        printf("%d\n",sum);        for(i=1;i<=n;i++)            for(j=1;j<=m;j++)                if(link[i][j].x)                    printf("(%d,%d)--(%d,%d)\n",i,j,link[i][j].x,link[i][j].y);    }    return 0;}