poj 2446 Chessboard (二分匹配)

Chessboard
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 12800   Accepted: 4000

Description

Alice and Bob often play games on chessboard. One day, Alice draws a board with size M * N. She wants Bob to use a lot of cards with size 1 * 2 to cover the board. However, she thinks it too easy to bob, so she makes some holes on the board (as shown in the figure below). 

We call a grid, which doesn’t contain a hole, a normal grid. Bob has to follow the rules below: 
1. Any normal grid should be covered with exactly one card. 
2. One card should cover exactly 2 normal adjacent grids. 

Some examples are given in the figures below: 
 
A VALID solution.

 
An invalid solution, because the hole of red color is covered with a card.

 
An invalid solution, because there exists a grid, which is not covered.

Your task is to help Bob to decide whether or not the chessboard can be covered according to the rules above.

Input

There are 3 integers in the first line: m, n, k (0 < m, n <= 32, 0 <= K < m * n), the number of rows, column and holes. In the next k lines, there is a pair of integers (x, y) in each line, which represents a hole in the y-th row, the x-th column.

Output

If the board can be covered, output "YES". Otherwise, output "NO".

Sample Input

4 3 2
2 1
3 3

Sample Output

YES

Hint

 
A possible solution for the sample input.

Source

POJ Monthly,charlescpp

 

 

和 hdu 1507类似,构无向图然后判断匹配数是否等于合法的格数。

心算32*32错了= = RE了两次,开始以为32*32是90+,第二次以为是900+,笔算后才知道是1024..

 1 //224K    125MS    C++    1731B    2014-06-10 12:44:41
 2 #include<iostream>
 3 #include<vector>
 4 #define N 1050
 5 using namespace std;
 6 vector<int>V[N];
 7 int match[N];
 8 int vis[N];
 9 int g[35][35];
10 int dfs(int u)
11 {
12     for(int i=0;i<V[u].size();i++){
13         int v=V[u][i];
14         if(!vis[v]){
15             vis[v]=1;
16             if(match[v]==-1 ||  dfs(match[v])){
17                 match[v]=u;
18                 return 1;
19             }
20         }
21     }
22     return 0;
23 }
24 int hungary(int n)
25 {
26     int ret=0;
27     memset(match,-1,sizeof(match));
28     for(int i=1;i<=n;i++){
29         memset(vis,0,sizeof(vis));
30         ret+=dfs(i);
31     }
32     return ret;
33 }
34 int main(void)
35 {
36     int n,m,k,x,y;
37     while(scanf("%d%d%d",&n,&m,&k)!=EOF)
38     {
39         memset(g,0,sizeof(g));
40         for(int i=0;i<N;i++) V[i].clear();
41         for(int i=0;i<k;i++){
42             scanf("%d%d",&y,&x);
43             g[x-1][y]=1;
44         }
45         int map[N]={0},pos=0;
46         for(int i=0;i<n;i++)
47             for(int j=1;j<=m;j++)
48                 if(!g[i][j]){
49                     if(!map[i*m+j]) map[i*m+j]=++pos;
50                     int u=map[i*m+j];
51                     if(j<m && !g[i][j+1]){
52                         if(!map[i*m+j+1]) map[i*m+j+1]=++pos;
53                         V[u].push_back(map[i*m+j+1]);
54                         V[map[i*m+j+1]].push_back(u);
55                     }
56                     if(i<n-1 &&  !g[i+1][j]){
57                         if(!map[(i+1)*m+j]) map[(i+1)*m+j]=++pos;
58                         V[u].push_back(map[(i+1)*m+j]);
59                         V[map[(i+1)*m+j]].push_back(u);
60                     }
61                 }
62         //printf("%d\n",pos);
63         if(hungary(pos)==pos) puts("YES");
64         else puts("NO");
65     }
66     return 0;
67 }

 

posted @ 2014-06-10 12:50  heaventouch  阅读(239)  评论(0编辑  收藏  举报