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

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

思路:poj2226-Muddy Fields

代码:

  1. #include<set>
  2. #include<map>
  3. #include<stack>
  4. #include<cmath>
  5. #include<queue>
  6. #include<vector>
  7. #include<string>
  8. #include<cstdio>
  9. #include<cstring>
  10. #include<sstream>
  11. #include<iostream>
  12. #include<algorithm>
  13. typedef long long ll;
  14. using namespace std;
  15. const int maxn = + ;
  16. const int MOD = 1e9 + ;
  17. const int INF = 0x3f3f3f3f;
  18. int linker[maxn];
  19. bool used[maxn];
  20. struct node{
  21. int row, col;
  22. }p[maxn][maxn];
  23. int n;
  24. int head[maxn], tot;
  25. struct Edge{
  26. int to, next;
  27. }edge[maxn * maxn];
  28. char mp[maxn][maxn];
  29. void init(){
  30. memset(head, -, sizeof(head));
  31. tot = ;
  32. }
  33. void addEdge(int u, int v){
  34. edge[tot].to = v;
  35. edge[tot].next = head[u];
  36. head[u] = tot++;
  37. }
  38. bool dfs(int u){
  39. for(int i = head[u]; i != -; i = edge[i].next){
  40. int v = edge[i].to;
  41. if(!used[v]){
  42. used[v] = true;
  43. if(linker[v] == - || dfs(linker[v])){
  44. linker[v] = u;
  45. return true;
  46. }
  47. }
  48. }
  49. return false;
  50. }
  51. int hungry(){
  52. int res = ;
  53. memset(linker, -, sizeof(linker));
  54. for(int u = ; u <= n; u++){
  55. memset(used, false, sizeof(used));
  56. if(dfs(u)) res++;
  57. }
  58. return res;
  59. }
  60. int main(){
  61. int r, c;
  62. while(~scanf("%d%d", &r, &c)){
  63. n = ;
  64. init();
  65. for(int i = ; i <= r; i++){
  66. scanf("%s", mp[i] + );
  67. for(int j = ; j <= c; j++){
  68. p[i][j].col = p[i][j].row = ;
  69. }
  70. }
  71. for(int i = ; i <= r; i++){
  72. for(int j = ; j <= c; j++){
  73. if(mp[i][j] == '*'){
  74. if(j > && mp[i][j - ] == '*'){
  75. p[i][j].row = p[i][j - ].row;
  76. }
  77. else{
  78. p[i][j].row = ++n;
  79. }
  80. }
  81. }
  82. }
  83. for(int i = ; i <= r; i++){
  84. for(int j = ; j <= c; j++){
  85. if(mp[i][j] == '*'){
  86. if(i > && mp[i - ][j] == '*'){
  87. p[i][j].col = p[i - ][j].col;
  88. }
  89. else{
  90. p[i][j].col = ++n;
  91. }
  92. addEdge(p[i][j].row, p[i][j].col);
  93. }
  94. }
  95. }
  96. printf("%d\n", hungry());
  97. }
  98. return ;
  99. }

POJ 2226 Muddy Fields(最小点覆盖)题解的更多相关文章

  1. POJ 2226 Muddy Fields (最小点覆盖集,对比POJ 3041)

    题意 给出的是N*M的矩阵,同样是有障碍的格子,要求每次只能消除一行或一列中连续的格子,最少消除多少次可以全部清除. 思路 相当于POJ 3041升级版,不同之处在于这次不能一列一行全部消掉,那些非障 ...

  2. POJ - 2226 Muddy Fields (最小顶点覆盖)

    *.*. .*** ***. ..*. 题意:有一个N*M的像素图,现在问最少能用几块1*k的木条覆盖所有的 * 点,k为>=1的任意值. 分析:和小行星那题很像.小行星那题是将一整行(列)看作 ...

  3. POJ 2226 Muddy Fields(最小顶点覆盖)

    POJ 2226 Muddy Fields 题目链接 题意:给定一个图,要求用纸片去覆盖'*'的位置.纸片能够重叠.可是不能放到'.'的位置,为最少须要几个纸片 思路:二分图匹配求最小点覆盖.和放车那 ...

  4. poj 2226 Muddy Fields (转化成二分图的最小覆盖)

    http://poj.org/problem?id=2226 Muddy Fields Time Limit: 1000MS   Memory Limit: 65536K Total Submissi ...

  5. poj 2226 Muddy Fields(最小覆盖点+构图)

    http://poj.org/problem?id=2226 Muddy Fields Time Limit: 1000MS   Memory Limit: 65536K Total Submissi ...

  6. [POJ] 2226 Muddy Fields(二分图最小点覆盖)

    题目地址:http://poj.org/problem?id=2226 二分图的题目关键在于建图.因为“*”的地方只有两种木板覆盖方式:水平或竖直,所以运用这种方式进行二分.首先按行排列,算出每个&q ...

  7. poj 2226 Muddy Fields(最小点覆盖+巧妙构图)

      Description Rain has pummeled the cows' field, a rectangular grid of R rows and C columns (1 <= ...

  8. poj 2226 Muddy Fields(最小点覆盖)

    题意: M*N的矩阵,每个格不是*就是#.     *代表水坑,#代表草地. 农民要每次可以用一块宽为1,长不限的木板去铺这个矩阵.要求这块木板不能覆盖草地.木板可以重复覆盖(即一块木板与另一块木板有 ...

  9. POJ 2226 Muddy Fields (二分图匹配)

    [题目链接] http://poj.org/problem?id=2226 [题目大意] 给出一张图,上面有泥和草地,有泥的地方需要用1*k的木板覆盖, 有草地的地方不希望被覆盖,问在此条件下需要的最 ...

随机推荐

  1. org.joda.time.DateTime 日期格式

    最近一直在使用Java,偶尔一次遇到日期(util)的格式转换,心里还是规矩的写着记忆里面的代码,但是在自己测试的时候发现不正确,具体看了下代码,发现这里使用jota的方式编写,顺道查了一下,做了笔记 ...

  2. Oracle / PLSQL函数 - DECODE

    1.DECODE( expression , search , result [, search , result]... [, default] ) 参数说明: expression : 表中的某一 ...

  3. DX9 顶点缓存案例

    // @time 2012.3.5 // @author jadeshu //包含头文件 #include <Windows.h> #include <d3d9.h> #pra ...

  4. kail linux arp欺骗

    首先连接wifi,进入内网 1,查看内网的存活主机  命令  fping -asg 192.168.1.0/24    (视不同环境而定,假设这里的路由器地址为 192.168.1.1) 也可利用其他 ...

  5. Marlin 擠出頭溫度控制PID值校正

    Marlin 擠出頭溫度控制PID值校正 擠出頭加熱器.溫度感應器安裝好後,先別急著直接指定工作溫度並且加熱.因為控制板上的溫度控制PID參數尚未校正.如果加熱速度過快,有可能會加熱過度並且導致零件燒 ...

  6. Tornado安装

    Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快.得利于其 非阻塞的方式和对 epoll 的运用,Tornado ...

  7. 转:wcf大文件传输解决之道(2)

    此篇文章主要是基于http协议应用于大文件传输中的应用,现在我们先解析下wcf中编码器的定义,编码器实现了类的编码,并负责将Message内存中消息转变为网络发送的字节流或者字节缓冲区(对于发送方而言 ...

  8. django 集合

    1,前言 socket 位于应用层和传输层之间的一个抽象层,它是一个接口. 百度的服务器(socket服务端) . 启动socket . 绑定ip和端口 . 监听 . 接收数据 . 发送数据 . 断开 ...

  9. var_dump()函数输出不完整,有省略号?解决办法

    php开发环境里,安装了xdebug模块后,var_dump()输出的结果将比较易于查看,但默认情况下,var_dump() 输出的结果将有所变化:过多的数组元素不再显示,字符串变量将只显示前N个字符 ...

  10. CentOS6.4下邮件服务器搭建

    CentOS6.4下邮件服务器搭建   linux下邮件服务器的搭建大致分为三个步骤 准备工作(真实的生产环境下需要) 发送服务器安装及配置 (Postfix) 接收服务器安装及配置(dovecot) ...