POJ 2446 Chessboard

要求用占两格的长方形铺满平面上除去指定点

二分图匹配

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 int dx[]={1,-1,0,0};
 6 int dy[]={0,0,1,-1};
 7 int map[40][40];
 8 int vis[40][40];
 9 int link[40*40];
10 int m,n,k;
11 bool check(int x,int y)
12 {
13     return 0<=x&&x<m&&0<=y&&y<n;
14 }
15 bool dfs(int t)
16 {
17     int nx,ny,nxt;
18     for(int i=0;i<4;i++)
19     {
20         nx=t/n+dx[i];
21         ny=t%n+dy[i];
22         if(check(nx,ny)&&!map[nx][ny]&&!vis[nx][ny])
23         {
24             vis[nx][ny]=1;
25             nxt=nx*n+ny;
26             if(link[nxt]==-1||dfs(link[nxt]))
27             {
28                 link[nxt]=t;
29                 return 1;
30             }
31         }
32     }
33     return 0;
34 }
35 int main()
36 {
37     int a,b;
38     while(~scanf("%d%d%d",&m,&n,&k))
39     {
40         memset(map,0,sizeof(map));
41         for(int i=0;i<k;i++)
42         {
43             scanf("%d%d",&b,&a);
44             a--; b--;
45             map[a][b]=1;
46         }
47         int ans=0;
48         memset(link,-1,sizeof(link));
49         for(int i=0;i<m;i++)
50         {
51             for(int j=0;j<n;j++)
52             {
53                 memset(vis,0,sizeof(vis));
54                 if(!map[i][j] && dfs(i*n+j)) ans++;
55             }
56         }
57         if(ans==n*m-k) puts("YES");
58         else puts("NO");
59     }
60 } 
时间: 2024-10-21 18:42:16

POJ 2446 Chessboard的相关文章

poj 2446 Chessboard (二分图利用奇偶性匹配)

Chessboard Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13176   Accepted: 4118 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

POJ 2446 Chessboard (二分图最大匹配)

题目链接:http://poj.org/problem?id=2446 给你一个n*m的棋盘,其中有k个洞,现在有1*2大小的纸片,纸片不能覆盖洞,并且每个格子最多只能被覆盖一次.问你除了洞口之外这个棋盘是否能被纸片填满. 这个题目一眼很难看出是二分图匹配... 可以根据i和j性质可以看出,i+j为奇数的上下相邻的i'和j'一定是偶数,那么一个1*2的纸片的i+j一定是一个奇数一个偶数.所以我是建立一个二分图两个集合,将i+j为奇数的点与上下左右相邻的点连在一起,当然点不是洞.最后就用匈牙利算法

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

POJ - 2446 Chessboard 二分图 最大匹配(输入坑)

题目大意:有一个n*m的棋盘,棋盘上面有k个洞. 现在要求你在这棋盘上面放1*2的矩形,使得棋盘上除k个洞之外的所有点都被1 * 2的矩形覆盖,且只覆盖一次 解题思路:思路不难想到,将每一点作为两个点集(除洞之外),点集之间的联系表示该点能联通的点,这样二分图就构造完成了 只需要求出最大匹配数,再和n * m -k比较即可 输入是个坑啊,输入的坐标是(x,y),但是表示的缺失y行,x列 #include<cstdio> #include<cstring> #include<v

POJ 2446 Chessboard(二分图最大匹配)

题意: M*N的棋盘,规定其中有K个格子不能放任何东西.(即不能被覆盖) 每一张牌的形状都是1*2,问这个棋盘能否被牌完全覆盖(K个格子除外) 思路: M.N很小,把每一个可以覆盖的格子都离散成一个个点,然后二分图最大匹配. 一个重要的问题**:可不可能存在建完的图是这样的情况:1-2,2-3,3-4,4-5,5-1?这种情况二分图最大匹配是5,但实际上答案是不对的. 证明:不可能存在这样的由奇个点构成的环图.我们按这种方法来看看能不能构造出这样一个棋盘. 假设有2k+1个个格(奇数),则第k+

(最小路径覆盖) poj 2446

E - Chessboard Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 2446 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

POJ 2446 二分图匹配

题意:给你一个n*m方格 让你用1*2的的小方格去铺满,其中有k个方格不能被铺到. 思路:二分图建图, 以每个格子为点建图,如果可以用一块1*2的小方格铺到,就连一条边. 每个格子在X集合和Y集合都有一个点,只要任意一边被匹配到了就算可以,然后就是二分图匹配了. 上代码. #include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> #include<vector

POJ——T2446 Chessboard

http://poj.org/problem?id=2446 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 18560   Accepted: 5857 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 c

poj 2446 二分图最大匹配

题意:给一张m*n的棋盘,上面有k个格子有洞,用1*2的骨牌将棋盘覆盖,每个格子必须被恰好覆盖一次,有洞的地方不能覆盖,问是否存在这样的方案. 思路:容易想到将格点作为二分图中的点,骨牌作为二分图中的边(骨牌可能放置时),求二分图的最大匹配,如果匹配数与n*m-k相等,则方案存在,否则不存在:容易想到当n*m-k为奇数时方案一定不存在: 构思时的难点在于将格点用一维坐标表示出来,后来发现是自己傻逼了.....标号就可以解决问题. 坑点:读入洞的坐标时列号在前,行号在后. 不算坑点的坑点:题目有多