POJ 2446 匈牙利算法
题意:
思路:
二分图匹配。。。
// by SiriusRen
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
#define N 1111
int n,m,k,xx[]={1,-1,0,0},yy[]={0,0,1,-1},jyx,jyy,T,fa[N],ans=0;
bool a[N][N],map[35][35],vis[N];
bool dfs(int x){
for(int i=1;i<=T;i++)
if(a[x][i]&&!vis[i]){
vis[i]=1;
if(!fa[i]||dfs(fa[i])){
fa[i]=x;return 1;
}
}
return 0;
}
int main()
{
scanf("%d%d%d",&m,&n,&k),T=(m-1)*n+n;
for(int i=1;i<=m;i++)map[i][0]=map[i][n+1]=1;
for(int i=1;i<=n;i++)map[0][i]=map[m+1][i]=1;
for(int i=1;i<=k;i++)scanf("%d%d",&jyy,&jyx),map[jyx][jyy]=1;
for(int i=1;i<=m;i++)for(int j=1;j<=n;j++)
if(!map[i][j])for(int l=0;l<4;l++)
if(!map[i+xx[l]][j+yy[l]])a[(i-1)*n+j][(i+xx[l]-1)*n+j+yy[l]]=1;
for(int i=1;i<=T;i++,memset(vis,0,sizeof(vis)))if(dfs(i))ans++;
if(ans+k==T)puts("YES");
else puts("NO");
}