首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

poj 2446 (2分匹配)

2013-09-28 
poj2446(二分匹配)题意;除了所给的一些点外,问能不能用1*2的矩形覆盖所有的点,矩形间不能重叠。思路:简单二

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


热点排行