题意:一片r*c的地,有些地方是泥地,需要铺地板。这些地板宽1,长无限,但只能铺在泥地上不能压到其他地方,问你铺满所有泥地最少几块

思路:我们把一行中连续的泥地看成整体,并把所有横的整体里的点编成一个id号,同样把竖的所有整体编号,这样一个点就有横竖两个编号,那么我给这两个编号连边,那么只要涂这个边就代表了这个点被模板盖住了,那么问题就转化为了最小点覆盖

思路:poj2226-Muddy Fields

代码:

#include<set>
#include<map>
#include<stack>
#include<cmath>
#include<queue>
#include<vector>
#include<string>
#include<cstdio>
#include<cstring>
#include<sstream>
#include<iostream>
#include<algorithm>
typedef long long ll;
using namespace std;
const int maxn = 1250 + 10;
const int MOD = 1e9 + 7;
const int INF = 0x3f3f3f3f;
int linker[maxn];
bool used[maxn];
struct node{int row, col;
}p[maxn][maxn];
int n;
int head[maxn], tot;
struct Edge{int to, next;
}edge[maxn * maxn];
char mp[maxn][maxn];
void init(){memset(head, -1, sizeof(head));tot = 0;
}
void addEdge(int u, int v){edge[tot].to = v;edge[tot].next = head[u];head[u] = tot++;
}
bool dfs(int u){for(int i = head[u]; i != -1; i = edge[i].next){int v = edge[i].to;if(!used[v]){used[v] = true;if(linker[v] == -1 || dfs(linker[v])){linker[v] = u;return true;}}}return false;
}
int hungry(){int res = 0;memset(linker, -1, sizeof(linker));for(int u = 1; u <= n; u++){memset(used, false, sizeof(used));if(dfs(u)) res++;}return res;
}
int main(){int r, c;while(~scanf("%d%d", &r, &c)){n = 0;init();for(int i = 1; i <= r; i++){scanf("%s", mp[i] + 1);for(int j = 1; j <= c; j++){p[i][j].col = p[i][j].row = 0;}}for(int i = 1; i <= r; i++){for(int j = 1; j <= c; j++){if(mp[i][j] == '*'){if(j > 1 && mp[i][j - 1] == '*'){p[i][j].row = p[i][j - 1].row;}else{p[i][j].row = ++n;}}}}for(int i = 1; i <= r; i++){for(int j = 1; j <= c; j++){if(mp[i][j] == '*'){if(i > 1 && mp[i - 1][j] == '*'){p[i][j].col = p[i - 1][j].col;}else{p[i][j].col = ++n;}addEdge(p[i][j].row, p[i][j].col);}}}printf("%d\n", hungry());}return 0;
}

转载于:https://www.cnblogs.com/KirinSB/p/10479331.html

POJ 2226 Muddy Fields(最小点覆盖)题解相关推荐

  1. POJ 2226 Muddy Fields 最小点覆盖+加建图(好题)

    题目链接 题目一看就是最小点覆盖,这道题与POJ - 3041 算是一类题,但是3041算是一道十分裸的,因为删除的是整行或者整列,所以图其实是现成的,但是本题的难点就在如何建图. 思路:首先还是尽量 ...

  2. POJ - 2226 Muddy Fields(最小点覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:给出一个n*m的地图,地图中'*'代表泥地,'.'代表空地,现在我们有两种木板,一种可以覆盖一行中的任意长度,我们成为行木板,另一种可以覆盖一列中的任意长度,我们成为列木 ...

  3. poj 2226 Muddy Fields 最小顶点覆盖

    题目链接:http://poj.org/problem?id=2226 这道题跟上一道很相似不同之处在于这里不是整行或者整列的删,而是连续的几个可以一起删,不连的不能删,这就要对原图进行处理,对原有的 ...

  4. poj 2226 Muddy Fields(合理建图+二分匹配)

    1 /* 2 题意:用木板盖住泥泞的地方,不能盖住草.木板任意长!可以重叠覆盖! '*'表示泥泞的地方,'.'表示草! 3 思路: 4 首先让我们回忆一下HDU 2119 Matrix这一道题,一个矩 ...

  5. POJ 3041 Asteroids(最小点覆盖)题解

    题意:n*n的网格中有k个点,开一枪能摧毁一行或一列的所有点,问最少开几枪 思路:我们把网格看成两个集合,行集合和列集合,如果有点x,y那么就连接x->y,所以我们只要做最小点覆盖就好了. 参考 ...

  6. Asteroids POJ - 3041 匈牙利算法+最小点覆盖König定理

    题意: 给出一个N*N的地图N   地图里面有K个障碍     你每次可以选择一条直线 消除这条直线上的所有障碍  (直线只能和列和行平行) 问最少要消除几次 题解: 如果(x,y)上有一个障碍 则把 ...

  7. POJ - 3041 Asteroids 二分图最小点覆盖

    题目链接 二分图一个很重要的定理:看了很多大神的博客表示看不懂为什么,以后再看 最小点覆盖=最大匹配 最小点覆盖就是在二分图里边,选择一个点,将所有与该点相链接的边删去,问最小找多少个点能够把所有的边 ...

  8. 【POJ 3041】Asteroids (最小点覆盖)

    每次选择清除一行或者一列上的小行星.最少选择几次. 将行和列抽象成点,第i行为节点i+n,第j列为节点j,每个行星则是一条边,连接了所在的行列. 于是问题转化成最小点覆盖.二分图的最小点覆盖==最大匹 ...

  9. POJ-2226 Muddy Fields 最小点集覆盖

    题目链接:http://poj.org/problem?id=2226 这题是POJ 3041的升级版本,很有意思,要求木板不能盖在草地上.那么这里我们可以把每行一连续'*'的看做行,把每列连续的'* ...

最新文章

  1. navicat 几个 可用的东西
  2. 一文带你了解被 BATJ 问烂的 TopK 问题
  3. 如何在linux下写脚本定时备份mysql数据库
  4. 【组合数学】生成函数 ( 生成函数应用场景 | 使用生成函数求解递推方程 )
  5. Algorithms_算法专项_Bitmap原理及应用
  6. 20个 css3 html5 设计工具
  7. Python 协程 asyncio 极简入门与爬虫实战
  8. 在Visual Studio 2005中安装Qt 4.3.2
  9. sql语句优化之一:尽量使用索引避免全表扫描
  10. 【三】版本之间穿梭切换
  11. 检测技术再进化:人物交互检测,基于多层次条件网络的方法(ICMR2020)
  12. jQuery之父:JavaScript的开发之路
  13. centos7安装python3_详解Centos7升级python 2.7至Python 3.7
  14. 大数据分析常见的几种方法
  15. php 抽象 接口类 区别,PHP 抽象類和接口區別
  16. 控制系统状态空间表达式的解(3)——求解线性定常系统零状态响应
  17. matlab可以算二重积分么,matlab 二重积分函数
  18. 淘宝天猫评论爬取,简单的办法完成滑动验证
  19. 【老九学堂】【C++】位运算符
  20. 【好记性不如烂笔头】二叉树之利用先序中序还原树

热门文章

  1. linux 指定jvm djava.library.path_JVM命令
  2. 伪元素写竖线_欧洲杯 | 让我们做个时髦伪球迷
  3. 谷歌了java集成开发_Spring整合Kaptcha谷歌验证码工具的开发步骤
  4. Tcl Tutorial 笔记6 ·while
  5. windows和Linux虚拟机或者云主机之间传输文件
  6. 单行溢出隐藏没生效_至今没搞懂,为什么这个缸这么火?
  7. python 重启程序_重新启动Python程序
  8. 宣传思想社工计算机考试内容,社工考试主要考什么?
  9. vc 2008建立c语言,C语言纯外行,要运行别人给的一个代码,用VC2008
  10. 规则引擎 drools_网易考拉规则引擎平台架构设计与实践