poj2446

来源:互联网 发布:网络欺诈案例 编辑:程序博客网 时间:2024/05/22 00:22

/* * 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;elsej = 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;elsej = 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)//judgeprintf("YES\n");elseprintf("NO\n");return 0;}

原创粉丝点击