poj2446
来源:互联网 发布:诺基亚6120c软件 编辑:程序博客网 时间:2024/05/01 07:56
题意:给出一个矩形N*M棋盘,有K个格子是空洞,然后用2*1的矩形,对所有非空洞的格子进行覆盖,如果可以全部覆盖,就puts("YES");
这题主要考的是如何建图,采用黑白建图
算法:建立二分图,用匈牙利算法;
我们分别对所有的格子进行标号1.。。N*M
将问题转化为二分图最大匹配问题。将棋盘按国际象棋棋盘那样添上黑白两种颜色,这样的话,黑色和白色的格子就构成了二分图的两个集合,即相邻的两个格子不会属于同个集合的。然后从上到下,从左到右对格子进行编号(除了洞),相邻的两格用边相连就构成一个二分图。然后求出最大匹配。。如果最大匹配+K=N*M就输出YES。。
二分图永远是单向的,本题中的二分图中的x和y是一样的,但是即使这样也不能认为这个二分图是双向的,在本题通过上面的方法建图以后,我们只要求出最大独立集的个数是不是等于洞的个数,或者判断这个二分图是不是完备的就行了。
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <map>using namespace std;const int maxn = 2000;int match[maxn];int visit[maxn];bool graph[maxn][maxn];bool hole[maxn][maxn];int id[maxn][maxn];int cent;bool dfs(int u){ for(int i = 1; i <= cent; i++) { if(graph[u][i] && !visit[i]) { visit[i] = 1; if(match[i] == -1 || dfs(match[i])) { match[i] = u; return true; } } } return false;}int Maxmatch(){ int sum = 0; memset(match,-1,sizeof(match)); for(int i = 1; i <= cent; i++) { memset(visit,0,sizeof(visit)); if(dfs(i)) ++sum; } return sum;}int main(){ int n,m,k; while(scanf("%d%d%d",&m,&n,&k) != EOF) { memset(graph,false,sizeof(graph)); for(int i = 1; i <= m; i++) for(int j = 1; j <= n; j++) hole[i][j] = true; while(k--) { int a,b; scanf("%d%d",&a,&b); hole[b][a] = false;//这里很坑爹...注意题意 } cent = 0; for(int i = 1; i <= m; i++) for(int j = 1; j <= n; j++) { if(hole[i][j]) { id[i][j] = ++cent; } } for(int i = 1; i <= m; i++) for(int j = 1; j <= n; j++) { if(hole[i][j]) { if(i-1>0 && hole[i-1][j]) graph[ id[i][j] ][ id[i-1][j] ] = true; if(i+1<=m && hole[i+1][j]) graph[ id[i][j] ][ id[i+1][j] ] = true; if(j-1>0 && hole[i][j-1]) graph[ id[i][j] ][ id[i][j-1] ] = true; if(j+1<=n && hole[i][j+1]) graph[ id[i][j] ][ id[i][j+1] ] = true; } } int ans = Maxmatch(); if(ans == cent) printf("YES\n"); else printf("NO\n"); } return 0;}
0 0
- poj2446
- poj2446
- poj2446
- POJ2446
- poj2446 Chessboard
- poj2446 Chessboard
- POJ2446 Chessboard
- poj2446 Chessboard
- POJ2446--Chessboard
- POJ2446 CHESSBOARD
- POJ2446【建图建图】
- POJ2446 二分图应用
- POJ2446:Chessboard(二分匹配)
- 【最大匹配】Chessboard POJ2446
- poj2446 Chessboard 二分匹配
- POJ2446 二分匹配
- poj2446--Chessboard(二分匹配)
- 二分图之poj2446
- 拓扑排序推荐博客
- 如何成为人上人?
- cin 和 getline()
- 1001. 害死人不偿命的(3n+1)猜想 (15)
- 8-类的静态成员函数
- poj2446
- mysql数据库错误码大全
- part01 从c到c++
- 古老的YUV视频呈现详解 及 RGB转换
- spoj 375
- Maximum Depth of Binary Tree
- Linux 管理常用命令
- HDU 5040
- hdu 4585 Shaolin 2013 ACM-ICPC杭州赛区全国邀请赛——题目重现