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