poj 2446 (二分匹配)

题意;除了所给的一些点外,问能不能用1*2的矩形覆盖所有的点,矩形间不能重叠。

思路:简单二分匹配,,,,,,,






 

#include<stdio.h>

#include<string.h>

const int N=1200;

int match[N],link[N],map[35][35],n,m;

int dir[4][2]={0,1,0,-1,1,0,-1,0};

int find(int u)

{

	int i,v,x,y,X,Y;

	x=u/m;y=u%m;

	for(i=0;i<4;i++)

	{

		X=x+dir[i][0];

		Y=y+dir[i][1];

		if(X<0||X>=n||Y<0||Y>=m||map[X][Y]==1)continue;

		v=X*m+Y;

		if(link[v]==0)

		{

			link[v]=1;

			if(match[v]==-1||find(match[v])==1)

			{

				match[v]=u;return 1;

			}

		}

	}

	return 0;

}

int main()

{

	int i,k,x,y,sum,j;

	while(scanf("%d%d%d",&n,&m,&k)!=-1)

	{

		if((m * n - k) & 1)

		{

			printf("NO\n");

			continue;

		}

		memset(map,0,sizeof(map));

		for(i=0;i<k;i++)

		{

			scanf("%d%d",&x,&y);

			x--;y--;

			map[y][x]=1;

		}

		memset(match,-1,sizeof(match));

		sum=0;

		for(i=0;i<n;i++)

		{

			for(j=0;j<m;j++)

			{

				if((i+j)%2==1||map[i][j])continue;

				memset(link,0,sizeof(link));

				sum+=find(i*m+j);

			}

		}

		if(sum*2+k==n*m)

			printf("YES\n");

		else printf("NO\n");

	}

	return 0;

}


 

 

你可能感兴趣的:(poj)