题目链接:点击查看

题目大意:给出一个n*n的棋盘,我们需要尽可能多地放置1*2大小的方块,有一些位置是不允许摆放的,问最多能放多少方块

题目分析:看到1*2大小的方块,就直接联想到之前状压dp的那个铺瓷砖的题了,有些不同的是,这个题目多了不允许摆放的点,并且题目数据给的很小,而且最后让求的还是最多能放多少方块,而不是方案数,换句话说,这个题用状态压缩就不太好做了,我们可以换个思路,因为每个点若想将其用方块覆盖,要么就是竖着放一块,要么就是横着放一块,只有这两种方法,所以这个题目就转换成了一个二分图的问题了,但这个题并不是之前那样关于横纵坐标求最小路径覆盖的问题,不用想的太复杂,我们只需要让尽可能多的点被覆盖即可,因为每覆盖两个点对答案的贡献相应就加一,但因为每个格子不能重复摆放,所以建边就成了一件比较麻烦的事情了

我们可以换个角度思考,当一个点(x,y)想要被一个方块覆盖时,只能与相邻四个方向的格子放置同一个方块才行,现在重点来了,相邻的四个方向,与当前点,横纵坐标之和的奇偶性发生了改变,也就是说对于任意一点来说,与其能够防止方块的点的奇偶一定是相反的,这样一来我们就可以直接根据奇偶拆点了,然后对于奇数点或者偶数点分为两个集合,建图后跑一下匈牙利即可,这样最后跑出来的答案就是正确答案了

这个题目算是奇偶拆点的一个比较简单的模板题了吧,前两天做过hdu的那个奇偶拆点的题目感觉还挺神奇的,但现在看来发现就是一种固定的套路,以后再看到类似的题目应该能立马想到这种方式吧

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=110;const int b[4][2]={0,1,0,-1,1,0,-1,0};int num1[N][N],num2[N][N],cnt1,cnt2;bool can[N][N];bool vis[N*N];int match[N*N];vector<int>node[N*N];bool dfs(int x)
{for(int i=0;i<node[x].size();i++){int y=node[x][i];if(!vis[y]){vis[y]=true;if(!match[y]||dfs(match[y])){match[y]=x;return true;}}}return false;
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);int n,m;scanf("%d%d",&n,&m);while(m--)//标记不可用的点{int x,y;scanf("%d%d",&x,&y);can[x][y]=true;} for(int i=1;i<=n;i++)//奇偶拆点for(int j=1;j<=n;j++){if((i+j)&1)num1[i][j]=++cnt1;elsenum2[i][j]=++cnt2;}for(int x=1;x<=n;x++)//建边for(int y=1;y<=n;y++){if(can[x][y])continue;for(int k=0;k<4;k++){int xx=x+b[k][0];int yy=y+b[k][1];if(xx<=0||yy<=0||xx>n||yy>n)continue;if(can[xx][yy])continue;if((x+y)&1)node[num1[x][y]].push_back(num2[xx][yy]);elsenode[num1[xx][yy]].push_back(num2[x][y]);}  }int ans=0;for(int i=1;i<=cnt1;i++){memset(vis,false,sizeof(vis));if(dfs(i))ans++;}printf("%d\n",ans);return 0;
}

CH - 6801 棋盘覆盖(二分图最大匹配+奇偶拆点)相关推荐

  1. CH - 6901 骑士放置(二分图最大独立集-二分图最大匹配+奇偶拆点)

    题目链接:点击查看 题目大意:给出一个n*m的棋盘,有t个点是禁止放棋子的,现在按照马走日的规则,问在互不影响的情况下最多能放多少个马 题目分析:这里首先简单介绍一下二分图最大独立集的定义: 通俗来讲 ...

  2. HDU - 3360 National Treasures(最小点覆盖-二分图最大匹配+奇偶拆点)

    题目链接:点击查看 题目大意:给出一个n*m的矩阵,每个点都有一个权值,-1表示该格子为警卫,否则表示该格子有宝物: 当前点的权值二进制为1的地方代表需要一个警卫(编号为二进制从右往左数的位置),警卫 ...

  3. HDU - 1151 Air Raid(最小路径覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:给出一个有向图,现在需要在不同的地方空降伞兵,保证所有伞兵沿着道路可以走完所有城市,求出最少伞兵的数量 题目分析:我们的目的是要用最少的路径覆盖所有顶点,换句话说就是二分 ...

  4. [tyvj1957 Poetize5] Vani和Cl2捉迷藏 (最小路径可重点覆盖+二分图最大匹配)

    传送门 Description 这片树林里有N座房子,M条有向道路,组成了一张有向无环图. 树林里的树非常茂密,足以遮挡视线,但是沿着道路望去,却是视野开阔.如果从房子A沿着路走下去能够到达B,那么在 ...

  5. POJ - 2594 Treasure Exploration(最小路径覆盖-二分图最大匹配+传递闭包)

    题目链接:点击查看 题目大意:给出一个有向图,现在需要让最少的机器人沿着图遍历所有点,求出最少需要机器人的数量,注意每个点可以重复遍历 题目分析:因为要遍历所有点,所以还是变成了二分图的最小路径覆盖问 ...

  6. POJ - 3020 Antenna Placement(最小路径覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:给出一个n*m的地图,图中'o'代表空地,'*'代表城市,现在需要给城市装无线网,每个无线网最多可以覆盖相邻的两个城市,问覆盖所有的城市最少需要装多少个无线网 题目分析: ...

  7. UVALive - 3126 Taxi Cab Scheme(最小路径覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:有n个人要坐出租车,每个人上车的时间已知,规定出租车必须在每个人上车之前的一分钟之前到达这个人的位置,之后给出每个人的当前坐标以及需要达到的目的地坐标,行驶完该段路程的时 ...

  8. 解题报告 (九) 二分图最大匹配

    文章目录 二分图最大匹配 解题报告 一.最大匹配模板题 HDU 1083 Courses HDU 2063 过山车 HDU 1528 Card Game Cheater HDU 1179 Olliva ...

  9. 2021牛客多校3 - Minimum grid(二分图最大匹配-最大流)

    题目链接:点击查看 题目大意:给出一个 n∗nn*nn∗n 的棋盘,其中有 mmm 个位置是需要填数字的位置,每个位置需要填 [0,k][0,k][0,k] 的数字中的其中一个,可以重复,现在给出每一 ...

最新文章

  1. 老生常谈:注释怎么写?
  2. 现行的web开发框架分析
  3. DHCP Option 60 的理解
  4. mysql having和where_浅谈Mysql中where和having的区别
  5. dijkstra算法_最短路径问题——迪杰斯特拉算法(Dijkstra)
  6. oracle预备份,oracle自动备份
  7. 第六章 输入输出系统-作业
  8. linux 创建目录和删除目录
  9. 【闲聊产品】之一:半路出家的产品经理
  10. configure: error: udev support requested but libudev header not installed
  11. 腾讯微博-转播到微博的简单使用
  12. Python(二):基本数据类型、序列的基本操作
  13. AVI、 MPEG 、 DivX、 Indeo Video 常见的编码与常见的文件格式
  14. Apple ID更换绑定的受信任电话号码教程
  15. 细胞周期预测 | 单细胞转录组(scRNA-seq)分析 03
  16. System.setOut(ps)重定义了输出流后,如何重定向控制台输出
  17. cgb2107-day08
  18. 一个简单的姓名拼音匹配
  19. 计算机英语论文及翻译,计算机专业英语翻译小论文
  20. html中取颜色快捷键,ps中填充颜色的快捷键是什么?

热门文章

  1. 性能建议(这里只针对单机版redis持久化做性能建议)
  2. Maven软件的下载安装
  3. 数据库-优化-数据库可以从哪几方面进行优化
  4. Zuul:路由转发,排除和自定义
  5. linux 系统arp检测工具,基于LinuxARP检测与防御系统.doc
  6. 深入理解Kafka(3)-Consumer
  7. jsp页面调用ajax,在jsp中使用jquery的ajax
  8. AngularDart Material Design 步进器
  9. Robotframework集成jenkins执行用例
  10. 腾讯微博发表带图片的微博