传送门:http://poj.org/problem?id=2446
把空白格点标号,连接相邻格点,二分图匹配,注意xy是反着给出的,坑……
Code:
/*
ID:iamzky
OJ:POJ
Index:2446
Language:C++
*/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int map[51][51];
int vis[2501];
int w[2501][5];
int Link[2501];
int n,m,k;
const int dx[4]={0,1,0,-1};
const int dy[4]={1,0,-1,0};
bool find(int x){
for(int i=1;i<=w[x][0];i++){
if(!vis[w[x][i]]){
vis[w[x][i]]=1;
if(!Link[w[x][i]]||find(Link[w[x][i]])){
Link[w[x][i]]=x;
return true;
}
}
}
return false;
}
int main(){
while(cin>>m>>n>>k){
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
map[i][j]=-1;
for(int i=1;i<=k;i++){
int x,y;
cin>>y>>x;
map[x][y]=0;
}
int tot=0;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++){
if(map[i][j]!=-1)continue;
map[i][j]=++tot;
}
if(tot%2){
cout<<"NO"<<endl;
break;
// return 0;
}
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++){
for(int k=0;k<4;k++){
int x=i+dx[k],y=j+dy[k];
if(x<1||y<1||x>m||y>n||map[x][y]==0||map[i][j]==0)continue;
w[map[i][j]][++w[map[i][j]][0]]=map[x][y];
}
}
int ans=0;
for(int i=1;i<=tot;i++){
memset(vis,0,sizeof(vis));
if(find(i))ans++;
}
//cout<<ans/2<<endl;
if(ans==tot){
cout<<"YES"<<endl;
}else
cout<<"NO"<<endl;
}
return 0;
}