Muddy Fields

原题去我创的专题里找。在文件夹首页。

题目:

给出N*M矩阵。当中*表示泥土,.表示小草。要你用最少的木板把泥土覆盖。

木板长度不限,可是仅仅能水平和竖直。

行列式二分匹配配。是poj3041建图的加强版。

算法:

由poj3041的建图能够得到灵感。即把木板当作顶点,X轴,Y轴当作边。求解最小顶点覆盖。

3041的激光束不存在障碍物的问题,而这题却有不能压坏小草的限制。

我们能够换个角度思考,既然不能压坏小草。那就相当于该激光束到达这里必须停止了。所以。我们就以小草为界分块的进行建图分析。每当遇到了小草就到做是行或者是列到头了。

这样一来就是普通的二分图了。

T_T这一题的数据是25*25是上限 。由于,最坏情况下是草和泥土相间出现。

还有就是以后做题的时候。特别是矩阵输入一定要注意输入行列问题!

!!

。!

!!!!

说多了都是泪啊。。。!

/*把对行列覆盖的木板当作点,则每一个格子变成了边,则问题转换成了最小顶点覆盖问题*/#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>
using namespace std;const int MAXN = 50 + 10;
const int MAXV = 1500;
vector<int> G[MAXV];char mp[MAXN][MAXN];
int numx[MAXN][MAXN],numy[MAXN][MAXN];
int match[MAXV];
bool used[MAXV];
int N,M,V;void init(){for(int i = 0;i <= N*M;++i)G[i].clear();
}bool dfs(int u){for(int i = 0;i < (int)G[u].size();++i){int v = G[u][i];if(!used[v]){used[v] = 1;if(match[v] == -1||dfs(match[v])){match[v] = u;return true;}}}return false;
}void solve(){int res = 0;memset(match,-1,sizeof(match));for(int i = 1;i <= V;++i){memset(used,0,sizeof(used));if(dfs(i)) res++;}printf("%d\n",res);
}int main()
{// freopen("Input.txt","r",stdin);while(~scanf("%d%d",&N,&M)){init();for(int i = 0;i < N;++i){scanf("%s",mp[i]);}int cnt = 0;memset(numx,0,sizeof(numx));memset(numy,0,sizeof(numy));for(int i = 0;i < N;++i)for(int j = 0;j < M;++j)if(mp[i][j] == '*'){++cnt;while(j < M&&mp[i][j] == '*'){numx[i][j] = cnt;++j;}}V = cnt;for(int j = 0;j < M;++j)for(int i = 0;i < N;++i)if(mp[i][j] == '*'){++cnt;while(i < N&&mp[i][j] == '*'){numy[i][j] = cnt;++i;}}for(int i = 0;i < N;++i){for(int j = 0;j < M;++j){if(numx[i][j] && numy[i][j]){G[numx[i][j]].push_back(numy[i][j]);}}}solve();}return 0;
}

转载于:https://www.cnblogs.com/brucemengbm/p/7040602.html

poj Muddy Fields相关推荐

  1. 洛谷:P6062 [USACO05JAN]Muddy Fields G

    题目链接:P6062 [USACO05JAN]Muddy Fields G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 此题重点在二分图的建图. 考虑放置木板的决策,由于可以重复 ...

  2. 51nod Muddy Fields 2856

    题意: 2856 Muddy Fields 1.0 秒 262,144.0 KB 80 分 5级题 在一个n*m的草地上有一些泥坑,现在可以用宽度为1,长度任意的长木板去覆盖泥坑,但是木板不能覆盖草地 ...

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

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

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

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

  5. 【POJ - 2226】Muddy Fields(匈牙利算法 或 网络流dinic,二分图匹配,最小点覆盖,矩阵中优秀的建图方式 )

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

  6. POJ 2226 Muddy Fields(最小点覆盖)题解

    题意:一片r*c的地,有些地方是泥地,需要铺地板.这些地板宽1,长无限,但只能铺在泥地上不能压到其他地方,问你铺满所有泥地最少几块 思路:我们把一行中连续的泥地看成整体,并把所有横的整体里的点编成一个 ...

  7. 【最小点覆盖】POJ 2226:Muddy Fields

    一.题目内容 POJ 2226 原题地址 二.题意解释 告诉你一个矩阵,让你用1 * x (x 为任意值) 的木板去铺符号* 可以覆盖 问最少多少木板能够把所有的*覆盖掉 三.代码及注释 #inclu ...

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

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

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

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

最新文章

  1. numpy.histogram
  2. Centos7 安装maven3.5.0和git
  3. 点云的无序性_PU-Net:解决3D点云数据的上采样问题
  4. ios点击大头针气泡不弹出_地图大头针气泡点击事件
  5. PHP 函数截图 哈哈哈
  6. 【蓝桥杯嵌入式】【STM32】7_RTC之实时时间显示和硬件闹钟设置
  7. 处理器架构 (十三) ARMv6架构下 各微架构的不同
  8. 关于华硕电脑FX80GE风扇模式无法调节
  9. 为啥春节抢红包总不是运气王?看完微信抢红包算法你就明白了
  10. java计算机毕业设计Web前端开发技术儿童教育网站MyBatis+系统+LW文档+源码+调试部署
  11. 魔兽争霸无法在这个计算机,W7系统魔兽争霸3不能初始化DirectX怎么办
  12. python打开读取文件内容
  13. python学习——matplotlib颜色设置适合论文的配色
  14. paip.重装系统后svn服务器修复
  15. sqlserver战德臣_SQLSERVER补位示例
  16. 用 JAVA 实现画板
  17. Sort_1000pics数据集利用CNN实现图像分类
  18. 郭麒麟任《最强大脑》见证官,住杭州的台湾人清华学霸吴哲维来了
  19. 使用ipmi调节r410的风扇转速
  20. JavaWeb 图书管理系统(数据库综合实验)

热门文章

  1. CLR via C# 3 读书笔记(4):第1章 CLR执行模型 — 1.4 执行程序集代码
  2. 结构类型需要重载GetHashCode和Equals
  3. 查了一晚上的资料,累啊。
  4. 《对Java的分析总结》-Java中的垃圾回收机制中的标记-清除算法 (五)
  5. SQL Alias(别名)
  6. from表单iframe原网页嵌入
  7. 【学习记录】Sql中存储过程的
  8. [ES6] 细化ES6之 -- Class关键字
  9. sizeof,strlen用法详解
  10. android app固定dp,Android屏幕适配—被偷走的dp