poj 2446 (二分匹配)

来源:互联网 发布:乐视电视软件 编辑:程序博客网 时间:2024/06/13 21:57

题意;除了所给的一些点外,问能不能用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;}


原创粉丝点击