pku 2446 构图 二分完全匹配

#include <iostream>
using namespace std;

const int MAXN = 33;

bool map[MAXN*MAXN][MAXN*MAXN];
bool hash[MAXN][MAXN];
int pre[MAXN*MAXN];
bool fuck[MAXN*MAXN];
int nu[MAXN][MAXN];
int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
int cnt, n, m, k;

bool dfs(int now)
{
	int i, j;
	for (i = 0; i < cnt; ++i)
	{
		if (map[now][i] && !fuck[i])
		{
			fuck[i] = true;
			if (pre[i] == -1 || dfs(pre[i]))
			{
				pre[i] = now;
				return true;
			}
		}
		
	}
	return false;
}
int main()
{
	while (scanf("%d %d %d", &n, &m, &k) != EOF)
	{
		memset(hash, 0, sizeof(hash));
		int i, j;
		for (i = 0; i < n*m; ++i)
		{
			pre[i] = -1;
			for (j = 0; j < n*m; ++j)
			{
				map[i][j] = 0;
			}
		}
		for (i = 0; i < k; ++i)
		{
			int x, y;
			scanf("%d %d", &y, &x);
			hash[x-1][y-1] = true;
		}
		if ((n*m-k) % 2)
		{
			printf("NO\n");
			continue;
		}
		
		cnt = 0;
		for (i = 0; i < n; ++i)
		{
			for (j = 0; j < m; ++j)
			{
				if (!hash[i][j])
				{
					nu[i][j] = cnt++;
				}
			}
		}
		for (i = 0; i < n; ++i)
		{
			for (j = 0; j < m; ++j)
			{
				if (!hash[i][j])
				{
					for (int p = 0; p < 4; ++p)
					{
						int fx, fy;
						fx = i + dir[p][0];
						fy = j + dir[p][1];
						if (fx >= 0 && fx < n && fy >= 0 && fy < m && !hash[fx][fy])
						{
							map[nu[i][j]][nu[fx][fy]] = true;
						}
					}
				}
			}
		}

		int num = 0;
		for (i = 0; i < cnt; ++i)
		{
			memset(fuck, 0, sizeof(fuck));
			if (dfs(i))
			{
				num++;
			}
		}
		if(num+k == n*m)
		{
			printf("YES\n");
		}
		else
		{
			printf("NO\n");
		}
	}
	return 0;
}

posted on 2009-07-27 20:31  ZAFU_VA  阅读(203)  评论(0编辑  收藏  举报

导航