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;
}


你可能感兴趣的:(编程,算法,百度,ACM,二分匹配)