[codevs1022]覆盖

试题描述

有一个N×M的单位方格中,其中有些方格是水塘,其他方格是陆地。如果要用1×2的矩阵区覆盖(覆盖过程不容许有任何部分重叠)这个陆地,那么最多可以覆盖多少陆地面积。

输入

输入文件的第一行是两个整数NM  (1<=NM<=100),第二行为一个整数K( K<=50),接下来的K行,每行两个整数X,Y表示K个水塘的行列位置。(1<=X<=N1<=Y<=M)。

输出

输出所覆盖的最大面积块(1×2面积算一块)。

输入示例

  1.  

输出示例

  1.  

数据规模及约定

见“输入

题解

黑白染色后,挖去那几个被排除的点跑二分图匹配。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <cctype>
  6. #include <algorithm>
  7. using namespace std;
  8. #define rep(i, s, t) for(int i = (s); i <= (t); i++)
  9. #define dwn(i, s, t) for(int i = (s); i >= (t); i--)
  10.  
  11. int read() {
  12. int x = 0, f = 1; char c = getchar();
  13. while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
  14. while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
  15. return x * f;
  16. }
  17.  
  18. #define maxn 20010
  19. #define maxm 320010
  20. #define oo 2147483647
  21.  
  22. struct Edge {
  23. int from, to, flow;
  24. Edge() {}
  25. Edge(int _1, int _2, int _3): from(_1), to(_2), flow(_3) {}
  26. };
  27. struct Dinic {
  28. int n, m, s, t, head[maxn], nxt[maxm];
  29. Edge es[maxm];
  30. int Q[maxn], hd, tl, vis[maxn];
  31. int cur[maxn];
  32.  
  33. void init() {
  34. m = 0; memset(head, -1, sizeof(head));
  35. return ;
  36. }
  37. void setn(int _) {
  38. n = _;
  39. return ;
  40. }
  41.  
  42. void AddEdge(int a, int b, int c) {
  43. es[m] = Edge(a, b, c); nxt[m] = head[a]; head[a] = m++;
  44. es[m] = Edge(b, a, 0); nxt[m] = head[b]; head[b] = m++;
  45. return ;
  46. }
  47.  
  48. bool BFS() {
  49. memset(vis, 0, sizeof(vis));
  50. hd = tl = 0; Q[++tl] = s; vis[s] = 1;
  51. while(hd < tl) {
  52. int u = Q[++hd];
  53. for(int i = head[u]; i != -1; i = nxt[i]) {
  54. Edge& e = es[i];
  55. if(!vis[e.to] && e.flow) {
  56. vis[e.to] = vis[u] + 1;
  57. Q[++tl] = e.to;
  58. }
  59. }
  60. }
  61. return vis[t] > 1;
  62. }
  63. int DFS(int u, int a) {
  64. if(u == t || !a) return a;
  65. int flow = 0, f;
  66. for(int &i = cur[u]; i != -1; i = nxt[i]) {
  67. Edge& e = es[i];
  68. if(vis[e.to] == vis[u] + 1 && (f = DFS(e.to, min(a, e.flow)))) {
  69. flow += f; a -= f;
  70. e.flow -= f; es[i^1].flow += f;
  71. if(!a) return flow;
  72. }
  73. }
  74. return flow;
  75. }
  76. int MaxFlow(int _s, int _t) {
  77. s = _s; t = _t;
  78. int flow = 0;
  79. while(BFS()) {
  80. rep(i, 1, n) cur[i] = head[i];
  81. flow += DFS(s, oo);
  82. }
  83. return flow;
  84. }
  85. } sol;
  86.  
  87. #define maxl 65
  88. int n, m, K, CntP;
  89. bool Map[maxl][maxl];
  90. struct Node {
  91. int id;
  92. Node(): id(0) {}
  93. int p() { return id ? id : id = ++CntP; }
  94. } nsi[maxl][maxl], nso[maxl][maxl], SS, TT;
  95.  
  96. int main() {
  97. n = read(); m = read(); K = read();
  98. rep(i, 1, K) {
  99. int x = read(), y = read();
  100. Map[x][y] = 1;
  101. }
  102. sol.init();
  103. rep(i, 1, n) rep(j, 1, m) if(!Map[i][j]){
  104. if(i < n && !Map[i+1][j]) sol.AddEdge(nso[i][j].p(), nsi[i+1][j].p(), 1), sol.AddEdge(nso[i+1][j].p(), nsi[i][j].p(), 1);
  105. if(j < n && !Map[i][j+1]) sol.AddEdge(nso[i][j].p(), nsi[i][j+1].p(), 1), sol.AddEdge(nso[i][j+1].p(), nsi[i][j].p(), 1);
  106. if((i ^ j) & 1) sol.AddEdge(SS.p(), nsi[i][j].p(), 1);
  107. else sol.AddEdge(nso[i][j].p(), TT.p(), 1);
  108. sol.AddEdge(nsi[i][j].p(), nso[i][j].p(), 1);
  109. }
  110. sol.setn(CntP);
  111. printf("%d\n", sol.MaxFlow(SS.p(), TT.p()));
  112.  
  113. return 0;
  114. }

[codevs1022]覆盖的更多相关文章

  1. codevs1022 覆盖[Hungary 二分图最大匹配]

    codevs1022 覆盖 有一个N×M的单位方格中,其中有些方格是水塘,其他方格是陆地.如果要用1×2的矩阵区覆盖(覆盖过程不容许有任何部分重叠)这个陆地,那么最多可以覆盖多少陆地面积. 输入描述  ...

  2. CODEVS1022 覆盖 (二分图染色+匈牙利算法)

    先对整幅图进行二分图染色,再跑一遍匈牙利算法. /* CODEVS1022 */ #include <cstdio> #include <cstring> #include & ...

  3. 匈牙利算法实战codevs1022覆盖

    1022 覆盖    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解  查看运行结果     题目描述 Description 有一个N×M的单位方格中 ...

  4. [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

    如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html   谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...

  5. Oracle数据库验证IMP导入元数据是否会覆盖历史表数据

    场景:imp导入数据时,最终触发器报错退出,并未导入存储过程.触发器.函数. 现在exp单独导出元数据,然后imp导入元数据,验证是否会影响已导入的表数据. 测试环境:CentOS 6.7 + Ora ...

  6. java继承覆盖与向上转型,权限

    子类可以覆盖父类的非final成员变量和重写非final方法 private私有变量和方法只能在类的内部使用,因此子类继承的同时会被隐藏,相当于不继承 protected变量,子类可以继承调用 方法被 ...

  7. 跳跃的舞者,舞蹈链(Dancing Links)算法——求解精确覆盖问题

    精确覆盖问题的定义:给定一个由0-1组成的矩阵,是否能找到一个行的集合,使得集合中每一列都恰好包含一个1 例如:如下的矩阵 就包含了这样一个集合(第1.4.5行) 如何利用给定的矩阵求出相应的行的集合 ...

  8. POJ 2125 Destroying the Graph 二分图最小点权覆盖

    Destroying The Graph Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8198   Accepted: 2 ...

  9. bootstrop 日期控件 datepicker被弹出框dialog覆盖的解决办法

    筒子们在使用bootstrap的日期控件(datepicker , 现在官网提供的名称叫 datetimepicker)时可能会遇到如上图的问题这是啥原因造成的呢? 答案很简单时输出的优先级造成的(z ...

随机推荐

  1. uC/OS-II队列(OS_q)块

    /*************************************************************************************************** ...

  2. WinForm------关于子窗体刷新父窗体问题

    链接: http://wenwen.sogou.com/z/q242758397.htm

  3. 安装vim的ycm

    环境centos 6.7 vim 7.3 安装vundle Vundle(Vim bundle)是一个Vim的插件管理器.它是把git操作整合进去,用户需要做的只是去GitHub上找到自己想要的插件的 ...

  4. mysql5.7.11编译安装以及修改root密码小结

    系统是cenos6.7 64位的,默认mysql5.7.11下载到/usr/local/src,安装目录在/app/local/mysql目录下,mysql数据放置目录/app/local/data. ...

  5. Enabling and Mounting NFS on CoreOS

    http://blog.scottlowe.org/2015/02/20/config-mount-nfs-coreos/ #cloud-config write-files: - path: /et ...

  6. Saltstack pillar组件

     pillar组件 pillar也是Saltstack最重要的组件之一,其作用是定义与被控主机相关的任何数据,定义好的数据可以被其他组件使用,如模板.state.API等.在pillar中定义的数据与 ...

  7. TFS2012 安装 配置笔记

    TFS2012安装   具体请看文档..   http://yunpan.cn/cmt4X6S7TjEgq  访问密码 464e     TFS2012配置 环境:VS2012  SQL2008  T ...

  8. fis总结

    1.fis捕获组 $1.$2.$3……是正则表达式替换中对捕获组的引用 $0或$&是对整个匹配字符串的引用 2.fis命令 fis3 release -d ../output prod -wL ...

  9. [Angularjs]表单验证

    写在前面 在开发中提交表单,并对表单的值进行验证是非常常见的操作,angularjs对表单验证提供了非常好的支持. demo 表单 <form name="myform" n ...

  10. shell编程中for file in $*; do是什么意思.

    $*是此行命令所在函数(脚本)的所有被传入参数的合集与$@类似,不用引号的情况下没有区别区别是当被""扩起来以后"$*"被当做一个字符串"$@&quo ...