/*
* poj2446.cpp
*
* Created on: 2010-8-11
* Author: friendy
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
//int pos[4][2] = { 0, 1, 1, 0, -1, 0, 0, -1 };
int m, n, tm, tn;
int map[2000][2000];
int Link[2000], used[2000];
//匈牙利
int path(int u) {
int i;
for (i = 1; i <= tn; i++) {
if (!used[i] && map[u][i]) {
used[i] = 1;
if (Link[i] == -1 || path(Link[i])) {
Link[i] = u;
return 1;
}
}
}
return 0;
}
int main() {
int i, j, k, a, b, l;
int mat[150][150];
scanf("%d%d%d", &m, &n, &k);
memset(mat, 0, sizeof(mat));
memset(Link, -1, sizeof(Link));
memset(map, 0, sizeof(map));
if ((m * n - k) % 2 != 0) {
printf("NO\n");
return 0;
}
for (i = 0; i < k; i++) {
scanf("%d%d", &a, &b);
mat[b][a] = -1;
}
//建图
tn = 0;
for (i = 1; i <= m; i++) {
if (i % 2 == 0)
j = 1;
else
j = 2;
for (; j <= n; j += 2) {
if (mat[i][j] != -1) {
++tn;
mat[i][j] = tn;
}
}
}
tm = 0;
for (i = 1; i <= m; i++) {
if (i % 2 == 0)
j = 2;
else
j = 1;
for (; j <= n; j+=2) {
if (mat[i][j] != -1) {
++tm;
mat[i][j] = tm;
if (j > 1 && mat[i][j - 1] != -1)
map[mat[i][j]][mat[i][j - 1]] = 1;
if (i > 1 && mat[i - 1][j] != -1)
map[mat[i][j]][mat[i - 1][j]] = 1;
if (j < n && mat[i][j + 1] != -1)
map[mat[i][j]][mat[i][j + 1]] = 1;
if (i < m && mat[i + 1][j] != -1)
map[mat[i][j]][mat[i + 1][j]] = 1;
}
}
}
int cnt = 0;
for (i = 1; i <= tm; i++) {
memset(used, 0, sizeof(used));
if (path(i))
cnt++;
}
if (cnt == (m*n - k)/2)//judge
printf("YES\n");
else
printf("NO\n");
return 0;
}
poj2446
最新推荐文章于 2021-09-17 20:48:17 发布