[codevs1022]覆盖
[codevs1022]覆盖
试题描述
有一个N×M的单位方格中,其中有些方格是水塘,其他方格是陆地。如果要用1×2的矩阵区覆盖(覆盖过程不容许有任何部分重叠)这个陆地,那么最多可以覆盖多少陆地面积。
输入
输入文件的第一行是两个整数N,M (1<=N,M<=100),第二行为一个整数K( K<=50),接下来的K行,每行两个整数X,Y表示K个水塘的行列位置。(1<=X<=N,1<=Y<=M)。
输出
输出所覆盖的最大面积块(1×2面积算一块)。
输入示例
输出示例
数据规模及约定
见“输入”
题解
黑白染色后,挖去那几个被排除的点跑二分图匹配。
- #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 2147483647
- struct 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;
- }
[codevs1022]覆盖的更多相关文章
- codevs1022 覆盖[Hungary 二分图最大匹配]
codevs1022 覆盖 有一个N×M的单位方格中,其中有些方格是水塘,其他方格是陆地.如果要用1×2的矩阵区覆盖(覆盖过程不容许有任何部分重叠)这个陆地,那么最多可以覆盖多少陆地面积. 输入描述 ...
- CODEVS1022 覆盖 (二分图染色+匈牙利算法)
先对整幅图进行二分图染色,再跑一遍匈牙利算法. /* CODEVS1022 */ #include <cstdio> #include <cstring> #include & ...
- 匈牙利算法实战codevs1022覆盖
1022 覆盖 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 查看运行结果 题目描述 Description 有一个N×M的单位方格中 ...
- [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)
如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html 谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...
- Oracle数据库验证IMP导入元数据是否会覆盖历史表数据
场景:imp导入数据时,最终触发器报错退出,并未导入存储过程.触发器.函数. 现在exp单独导出元数据,然后imp导入元数据,验证是否会影响已导入的表数据. 测试环境:CentOS 6.7 + Ora ...
- java继承覆盖与向上转型,权限
子类可以覆盖父类的非final成员变量和重写非final方法 private私有变量和方法只能在类的内部使用,因此子类继承的同时会被隐藏,相当于不继承 protected变量,子类可以继承调用 方法被 ...
- 跳跃的舞者,舞蹈链(Dancing Links)算法——求解精确覆盖问题
精确覆盖问题的定义:给定一个由0-1组成的矩阵,是否能找到一个行的集合,使得集合中每一列都恰好包含一个1 例如:如下的矩阵 就包含了这样一个集合(第1.4.5行) 如何利用给定的矩阵求出相应的行的集合 ...
- POJ 2125 Destroying the Graph 二分图最小点权覆盖
Destroying The Graph Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8198 Accepted: 2 ...
- bootstrop 日期控件 datepicker被弹出框dialog覆盖的解决办法
筒子们在使用bootstrap的日期控件(datepicker , 现在官网提供的名称叫 datetimepicker)时可能会遇到如上图的问题这是啥原因造成的呢? 答案很简单时输出的优先级造成的(z ...
随机推荐
- uC/OS-II队列(OS_q)块
/*************************************************************************************************** ...
- WinForm------关于子窗体刷新父窗体问题
链接: http://wenwen.sogou.com/z/q242758397.htm
- 安装vim的ycm
环境centos 6.7 vim 7.3 安装vundle Vundle(Vim bundle)是一个Vim的插件管理器.它是把git操作整合进去,用户需要做的只是去GitHub上找到自己想要的插件的 ...
- mysql5.7.11编译安装以及修改root密码小结
系统是cenos6.7 64位的,默认mysql5.7.11下载到/usr/local/src,安装目录在/app/local/mysql目录下,mysql数据放置目录/app/local/data. ...
- Enabling and Mounting NFS on CoreOS
http://blog.scottlowe.org/2015/02/20/config-mount-nfs-coreos/ #cloud-config write-files: - path: /et ...
- Saltstack pillar组件
pillar组件 pillar也是Saltstack最重要的组件之一,其作用是定义与被控主机相关的任何数据,定义好的数据可以被其他组件使用,如模板.state.API等.在pillar中定义的数据与 ...
- TFS2012 安装 配置笔记
TFS2012安装 具体请看文档.. http://yunpan.cn/cmt4X6S7TjEgq 访问密码 464e TFS2012配置 环境:VS2012 SQL2008 T ...
- fis总结
1.fis捕获组 $1.$2.$3……是正则表达式替换中对捕获组的引用 $0或$&是对整个匹配字符串的引用 2.fis命令 fis3 release -d ../output prod -wL ...
- [Angularjs]表单验证
写在前面 在开发中提交表单,并对表单的值进行验证是非常常见的操作,angularjs对表单验证提供了非常好的支持. demo 表单 <form name="myform" n ...
- shell编程中for file in $*; do是什么意思.
$*是此行命令所在函数(脚本)的所有被传入参数的合集与$@类似,不用引号的情况下没有区别区别是当被""扩起来以后"$*"被当做一个字符串"$@&quo ...