您的位置:首页 > 其它

poj 2446 (二分匹配)

2013-09-25 19:25 399 查看
题意;除了所给的一些点外,问能不能用1*2的矩形覆盖所有的点,矩形间不能重叠。

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

#include<stdio.h>
#include<string.h>
const int N=1200;
int match
,link
,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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: