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.
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 }