现在的位置: 首页 > 综合 > 正文

hdu 1507 (最大匹配)

2018年12月28日 ⁄ 综合 ⁄ 共 971字 ⁄ 字号 评论关闭

求能出售多少个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;
}

抱歉!评论已关闭.