[codevs1022]覆盖

试题描述

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

输入

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

输出

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

输入示例

4 4
6
1 1
1 4
2 2
4 1
4 2
4 4

输出示例

4

数据规模及约定

见“输入

题解

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

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
using namespace std;
#define rep(i, s, t) for(int i = (s); i <= (t); i++)
#define dwn(i, s, t) for(int i = (s); i >= (t); i--)int read() {int x = 0, f = 1; char c = getchar();while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }return x * f;
}#define maxn 20010
#define maxm 320010
#define oo 2147483647struct Edge {int from, to, flow;Edge() {}Edge(int _1, int _2, int _3): from(_1), to(_2), flow(_3) {}
};
struct Dinic {int n, m, s, t, head[maxn], nxt[maxm];Edge es[maxm];int Q[maxn], hd, tl, vis[maxn];int cur[maxn];void init() {m = 0; memset(head, -1, sizeof(head));return ;}void setn(int _) {n = _;return ;}void AddEdge(int a, int b, int c) {es[m] = Edge(a, b, c); nxt[m] = head[a]; head[a] = m++;es[m] = Edge(b, a, 0); nxt[m] = head[b]; head[b] = m++;return ;}bool BFS() {memset(vis, 0, sizeof(vis));hd = tl = 0; Q[++tl] = s; vis[s] = 1;while(hd < tl) {int u = Q[++hd];for(int i = head[u]; i != -1; i = nxt[i]) {Edge& e = es[i];if(!vis[e.to] && e.flow) {vis[e.to] = vis[u] + 1;Q[++tl] = e.to;}}}return vis[t] > 1;}int DFS(int u, int a) {if(u == t || !a) return a;int flow = 0, f;for(int &i = cur[u]; i != -1; i = nxt[i]) {Edge& e = es[i];if(vis[e.to] == vis[u] + 1 && (f = DFS(e.to, min(a, e.flow)))) {flow += f; a -= f;e.flow -= f; es[i^1].flow += f;if(!a) return flow;}}return flow;}int MaxFlow(int _s, int _t) {s = _s; t = _t;int flow = 0;while(BFS()) {rep(i, 1, n) cur[i] = head[i];flow += DFS(s, oo);}return flow;}
} sol;#define maxl 65
int n, m, K, CntP;
bool Map[maxl][maxl];
struct Node {int id;Node(): id(0) {}int p() { return id ? id : id = ++CntP; }
} nsi[maxl][maxl], nso[maxl][maxl], SS, TT;int main() {n = read(); m = read(); K = read();rep(i, 1, K) {int x = read(), y = read();Map[x][y] = 1;}sol.init();rep(i, 1, n) rep(j, 1, m) if(!Map[i][j]){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);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);if((i ^ j) & 1) sol.AddEdge(SS.p(), nsi[i][j].p(), 1);else sol.AddEdge(nso[i][j].p(), TT.p(), 1);sol.AddEdge(nsi[i][j].p(), nso[i][j].p(), 1);}sol.setn(CntP);printf("%d\n", sol.MaxFlow(SS.p(), TT.p()));return 0;
}

转载于:https://www.cnblogs.com/xiao-ju-ruo-xjr/p/6034873.html

[codevs1022]覆盖相关推荐

  1. 浅显易懂 Makefile 入门 (02)— 普通变量和自动变量定义、使用($@、$^、$< 作用)、变量覆盖 override、变量的来源 origin

    1. 变量的定义 Makefile 文件中定义变量的基本语法如下: 变量的名称=值列表 变量的名称可以由大小写字母.阿拉伯数字和下划线构成.等号左右的空白符没有明确的要求,因为在执行 make 的时候 ...

  2. LeetCode简单题之检查是否区域内所有整数都被覆盖

    题目 给你一个二维整数数组 ranges 和两个整数 left 和 right .每个 ranges[i] = [starti, endi] 表示一个从 starti 到 endi 的 闭区间 . 如 ...

  3. html滑动逐渐覆盖效果,创意jQuery和CSS3滑动覆盖响应式幻灯片特效

    这是一款非常有创意的jQuery和CSS3滑动覆盖响应式幻灯片特效.该幻灯片特效采用响应式设计,在幻灯片切换时使用一个滑动块状区域来进行覆盖,显示新的幻灯片内容,整体效果非常不错. 使用方法 HTML ...

  4. 多个矩形,求覆盖面积,周长,及交点

    问题:给出若干个矩形,(给的是矩形左上角和右下角坐标),求最后所得图形的面积/周长: 三个矩形如左图所示,而若要计算面积,看右图,用3个矩形各自的面积之和减去重复部分(红色和蓝色)的面积 人算很简单, ...

  5. 简单几何(线段覆盖) POJ 3347 Kadj Squares

    题目传送门 题意:告诉每个矩形的边长,它们是紧贴着的,问从上往下看,有几个还能看到. 分析:用网上猥琐的方法,将边长看成左端点到中心的距离,这样可以避免精度问题.然后先求出每个矩形的左右端点,然后如果 ...

  6. 一条直线上N个线段所覆盖的总长度

    转自http://blog.csdn.net/bxyill/article/details/8962832 问题描述: 现有一直线,从原点到无穷大. 这条直线上有N个线段.线段可能相交. 问,N个线段 ...

  7. Java知多少(29)覆盖和重载

    在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的名称.返回值类型.参数列表. 如果在新类中定义一个方法,其名称.返回值类型和参数列表正好与父类 ...

  8. c++ 的重载、覆盖、隐藏

    成员函数被重载的特征: (1)相同的范围(在同一个类中): (2)函数名字相同: (3)参数不同: (4)virtual关键字可有可无. 覆盖是指派生类函数覆盖基类函数,特征是: (1)不同的范围(分 ...

  9. python用for循环一直出现最后一个值_python中for循环的list最后一个数据总会覆盖前面的数据...

    问 题 1.如题,我真的是没办法了,用尽各种方法list的最后一个数据都会覆盖前面的数据. 2. class lotto_result_cl: def __init__(self, index, sp ...

最新文章

  1. Java面试人事篇(二)
  2. 地理坐标xy表示什么_建筑测量xy坐标的区别
  3. python会调用linuxapi吗_RouterOS之python调用API
  4. 4.4MSSQLServer常用版本介绍
  5. mysql下sql语句 update 字段=字段+字符串
  6. NSString的各种用法总结(创建、截取、判断比较、转化数据类型、拼接、替换、添加、追加、读取、写入、删去、改变)
  7. hdu1024Max Sum Plus Plus
  8. LeetCode 381. O(1) 时间插入、删除和获取随机元素 - 允许重复(vector + 哈希)
  9. mysql通信协议的半双工机制理解
  10. 祝微软北京.net俱乐部徐磊生日快乐
  11. node 压缩图片_免费的图片最佳化工具,支持JPG、PNG等格式的无损压缩
  12. 基于Spring MVC + Spring + MyBatis的【银行卡系统】
  13. Windows中如何修改Intel网卡的注册表使Wireshark可以抓取802.1q tag包
  14. 门多萨与马尔克斯谈话录
  15. 解放双手!用 Python 控制你的鼠标和键盘
  16. 单片机c语言1ms 2ms 4ms方波,定时器使用:利用单片机内部定时器0通过P1.0端口输出一定周期的方波信号。 - 试题答案网问答...
  17. 计算机中乘法是什么函数,excl中的乘法函数符号是什么
  18. C语言(总有刁民想害朕)
  19. 功能点:3秒倒计时自动跳转指定页面
  20. php 数组转二进制,php转16进制_php 十六进制转化为二进制的代码

热门文章

  1. UniCode 下 CString 转 char* 的方法
  2. Docker Remote API v1.12使用
  3. 基于词典的正向最大匹配中文分词算法,能实现中英文数字混合分词
  4. PHP获取当前url路径的函数及服务器变量:QUERY_STRING、REQUEST_URI、SCRIPT...
  5. Linux属于下面哪一种软件,【单选题】下面软件中属于自由软件开放源码的是( )。 A. Unix B. Linux C. Mi...
  6. java修改cookie的值_Java 对 Cookie增删改查的实现示例
  7. 2.1.2 数据通信基础知识
  8. logo语言linux,用 screenfetch 和 linux_logo 显示带有酷炫 Linux 标志的基本硬件信息
  9. pywebio 和 pyecharts天生一对
  10. 使用pymongo将文件存入MongoDB