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

题干:

Rain has pummeled the cows' field, a rectangular grid of R rows and C columns (1 <= R <= 50, 1 <= C <= 50). While good for the grass, the rain makes some patches of bare earth quite muddy. The cows, being meticulous grazers, don't want to get their hooves dirty while they eat. 

To prevent those muddy hooves, Farmer John will place a number of wooden boards over the muddy parts of the cows' field. Each of the boards is 1 unit wide, and can be any length long. Each board must be aligned parallel to one of the sides of the field. 

Farmer John wishes to minimize the number of boards needed to cover the muddy spots, some of which might require more than one board to cover. The boards may not cover any grass and deprive the cows of grazing area but they can overlap each other. 

Compute the minimum number of boards FJ requires to cover all the mud in the field.

Input

* Line 1: Two space-separated integers: R and C 

* Lines 2..R+1: Each line contains a string of C characters, with '*' representing a muddy patch, and '.' representing a grassy patch. No spaces are present.

Output

* Line 1: A single integer representing the number of boards FJ needs.

Sample Input

4 4
*.*.
.***
***.
..*.

Sample Output

4

Hint

OUTPUT DETAILS: 

Boards 1, 2, 3 and 4 are placed as follows: 
1.2. 
.333 
444. 
..2. 
Board 2 overlaps boards 3 and 4.

题目大意:

如下图告诉你一个矩阵,让你用1 * x (x 为任意值) 的木板去铺符号*  可以覆盖

问最少多少木板能够把所有的*覆盖掉

解题报告:

    这应该是自ACM入坑以来做的最接近网络流的一道题,回顾这半年多的题海中的挣扎,现在碰触到高级算法的边缘了,感慨万千啊!话不多说,这题重点和难点在于建图。

首先,这种类型的大概就是二分图的最小点覆盖或者最小边覆盖,建图的方式就是:左侧集合表示行的连通块,右侧集合表示列的连通块,这样如果左侧和右侧有条边,说明这个格子(单蹦 或者是 连通块的交点)是需要被覆盖的,于是乎所有的 ' * ' ,都被蕴含在这些边中,所以我们只需要找一些连通块,也就是找一些点,来使所有的边都与之有联系,就可以了。又因为要求最小的木板个数,也就是求最小点覆盖集。又因为二分图中 最小点覆盖集 = 最大匹配 ,所以匈牙利就搞定了。

另:这里是巧妙用了vis1和vis2来记录连通块标号,所以一个for循环就都处理完了,但是如果用if(maze[i][j-1]=='*')这么来判断,那就最好先处理vis1,再vis2,写两次for循环,这样不容易乱。

(ps:定义数组的时候MAX*MAX的,多加个 / 2,就226ms变到63ms、、、恐怖啊)

附图:

另外,邻接表可以优化到0ms。。。。

AC代码:

#include<bits/stdc++.h> 
using namespace std;const int MAX = 55;
int line[MAX * MAX][MAX * MAX];
int nxt[MAX * MAX];
bool used[MAX * MAX];
char maze[MAX][MAX];
int vis1[MAX][MAX], vis2[MAX][MAX];
int n,m,tot1,tot2;
bool find(int u) {for(int i = 1; i <= tot2; i++) {if(line[u][i] && !used[i]) {used[i] = 1;if(nxt[i] == -1 || find(nxt[i])) {nxt[i] = u;return true;}}}return false;
}
int match() {int cnt = 0;memset(nxt, -1, sizeof(nxt));for(int i = 1; i <= tot1; i++) {memset(used, 0, sizeof(used));if(find(i)) cnt++;}return cnt;
}
int main() 
{while(~scanf("%d%d",&n,&m)) {for(int i = 1; i <= n; i++) {scanf("%s",maze[i]+1); }tot1=tot2=0;memset(vis1,0,sizeof(vis1));memset(vis2,0,sizeof(vis2));memset(line,0,sizeof(line));for(int i = 1; i <= n; i++) {for(int j = 1; j <= m; j++) {if(maze[i][j] == '*') {if(!vis1[i][j - 1]) vis1[i][j] = ++tot1;else vis1[i][j] = vis1[i][j - 1];if(!vis2[i - 1][j]) vis2[i][j] = ++tot2;else vis2[i][j] = vis2[i - 1][j];}}}for(int i = 1; i <= n; i++) {for(int j = 1; j <= m; j++) {if(maze[i][j] == '*') {line[vis1[i][j]][vis2[i][j]] = 1;
//					printf("**%d %d %d %d\n",i,j,vis1[i][j],vis2[i][j]);}}}printf("%d\n",match());}return 0;
}
/*2 2
**
.**/

网络流的解法看:题解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/441473.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot的原生cache_springboot-shiro-redis-session-cache

1.配置mysql和redis redis的需要配置密码 原生jedis的使用相对于spring-data-redis更加灵活 所以本项目用原生jedis来直接作为缓存使用 具体使用方法请参看相关配置 特别注意如果mysql是5.7以上版本&#xff0c;请去掉sql_mode中的ONLY_FULL_GROUP_BY 本项目用户支持多角色多部…

【51Nod - 1272 】最大距离 (思维,排序sort的空间优化)

题干&#xff1a; 给出一个长度为N的整数数组A&#xff0c;对于每一个数组元素&#xff0c;如果他后面存在大于等于该元素的数&#xff0c;则这两个数可以组成一对。每个元素和自己也可以组成一对。例如&#xff1a;{5, 3, 6, 3, 4, 2}&#xff0c;可以组成11对&#xff0c;如…

javaweb在线问卷系统_2020 最新流行的Java Web报表工具比对

随着信息系统的高速发展&#xff0c;报表平台逐渐成为了信息系统当中最为核心和重要的功能模块。报表工具有助于将原始数据可视化显示&#xff0c;使决策者或者相关人员能够一览整体的数据趋势&#xff0c;完整的报表解决方案会提供多样的表格数据展示、数据可视化元素&#xf…

python 深copy_python中的深copy和浅copy

bytesPython bytes/strbytes 在Python3中作为一种单独的数据类型&#xff0c;不能拼接&#xff0c;不能拼接&#xff0c;不能拼接>>> €20.encode(utf-8)b\xe2\x82\xac20>>> b\xe2\x82\xac20.decode(utf-8)€20解码>>> b\xa420.decode(windows-1255…

【HDU - 4185】Oil Skimming (二分图,建图,匈牙利算法)

题干&#xff1a; Thanks to a certain "green" resources company, there is a new profitable industry of oil skimming. There are large slicks of crude oil floating in the Gulf of Mexico just waiting to be scooped up by enterprising oil barons. One …

python pandas read_csv 迭代器使用方法_pandas.read_csv参数详解(小结)

更多python教程请到友情连接&#xff1a; 菜鸟教程www.piaodoo.com人人影视www.sfkyty.com飞卢小说网www.591319.com韩剧网www.op-kg.com兴化论坛www.yimoge.cn星辰影院www.hhsos.netpandas.read_csv参数整理读取CSV(逗号分割)文件到DataFrame也支持文件的部分导入和选择迭代参…

【HDU - 2398 】Savings Account (水题模拟)

题干&#xff1a; Suppose you open a savings account with a certain initial balance. You will not make any withdrawals or further deposits for a number of years. The bank will compound your balance (add the annual interest) once a year, on the anniversary …

隧道凿岩机器人_隧道凿岩机器人的研制

隧道凿岩机器人的研制隧道、洞室开挖是现代交通、能源、采掘、建筑等大规模基本建设中的一项难度大、耗资耗时多、劳动条件差但又十分重要、十分关键的施工作业。早期的液压凿岩设备全都是由人工操作的液压凿岩钻车&#xff0c;其施工效率和施工精度完全取决于操作人员的熟练程…

【HDU - 1045】Fire Net (dfs 或二分图)

题干&#xff1a; Suppose that we have a square city with straight streets. A map of a city is a square board with n rows and n columns, each representing a street or a piece of wall. A blockhouse is a small castle that has four openings through which to …

html 按钮 按下 状态_第一次按下是启动,第二次按下是停止,俵哥分享2种接线方法...

朋友们大家好我是大俵哥&#xff0c;今天我们来说一下单按钮启停电路。这个电路虽然应用的不多&#xff0c;但是非常的经典&#xff0c;新手朋友们可以拿来练手。今天我们讲2种控制方法&#xff0c;一种用中间继电器控制一种用时间继电器控制&#xff0c;在看电路之前&#xff…

【 CodeForces - 1060B 】Maximum Sum of Digits(思维,构造)

题干&#xff1a; You are given a positive integer nn. Let S(x)S(x) be sum of digits in base 10 representation of xx, for example, S(123)1236S(123)1236, S(0)0S(0)0. Your task is to find two integers a,ba,b, such that 0≤a,b≤n0≤a,b≤n, abnabn and S(a)S(…

mysql 异步_MySQL -- 异步I/O

linux上&#xff0c;innodb使用异步IO子系统(native AIO)来对数据文件页进行预读和写请求。行为受到参数innodb_use_native_aio控制。默认是开启的&#xff0c;且只是适用于linux平台&#xff0c;需要libaio库。在其他的类unix平台上&#xff0c;innodb使用的是同步I/O。由于历…

【CodeForces - 633D】Fibonacci-ish (离散化,暴力枚举+STPmap,fib数列收敛性质)

题干&#xff1a; Yash has recently learnt about the Fibonacci sequence and is very excited about it. He calls a sequence Fibonacci-ish if the sequence consists of at least two elementsf0 and f1 are arbitraryfn  2  fn  1  fn for all n ≥ 0. You …

sql server 迁移 mysql_【转】sql server迁移到mysql

【1】MSSQL2SQLSQL Server转换为MySQL工具&#xff0c;用了一下 感觉蛮不错的。分享上来&#xff0c;同时也以便记录下来以后自用。工具名称&#xff1a;Mss2sql来个操作流程:下载后打开压缩包运行mss2sql默认就是Move to MysQL server directly,选择下一步继续下一步,稍等片刻…

【51Nod - 1268】和为K的组合 (背包 或 dfs)

题干&#xff1a; 给出N个正整数组成的数组A&#xff0c;求能否从中选出若干个&#xff0c;使他们的和为K。如果可以&#xff0c;输出&#xff1a;"Yes"&#xff0c;否则输出"No"。 Input 第1行&#xff1a;2个数N, K, N为数组的长度, K为需要判断的和(…

centos7 mysql tar_CentOS7中mysql-5.7.21-el7-x86_64.tar.gz版MySQL的安装与配置

一、准备阶段通常情况下&#xff0c;MySQL在CentOS下主要使用glibc、rpm、yum等方式进行安装&#xff0c;使用mysql-5.7.21-el7-x86_64.tar.gz包进行安装的很少见&#xff0c;网上资料也较少。通过一上午的摸索&#xff0c;总结出如下安装方法。下载安装包&#xff1a;[rootGee…

【51Nod - 1416】两点 (dfs 或 并查集+dfs)

题干&#xff1a; 福克斯在玩一款手机解迷游戏&#xff0c;这个游戏叫做”两点”。基础级别的时候是在一个nm单元上玩的。像这样&#xff1a; 每一个单元有包含一个有色点。我们将用不同的大写字母来表示不同的颜色。 这个游戏的关键是要找出一个包含同一颜色的环。看上图中4…

linux 源码安装mysql5.7_linux安装mysql5.7.27

一、卸载mysql安装有三种方式&#xff0c;包括二进制包安装(Using Generic Binaries)、RPM包安装、源码安装。一般是前两种比较多二、安装建议路径设置按照写的来将下载的压缩包复制到linux服务器/usr/local/路径下(下载地址https://dev.mysql.com/downloads/mysql/,进去下载默…

【51Nod - 1010 】只包含因子2 3 5的数 (打表,有坑越界)

题干&#xff1a; K的因子中只包含2 3 5。满足条件的前10个数是&#xff1a;2,3,4,5,6,8,9,10,12,15。 所有这样的K组成了一个序列S&#xff0c;现在给出一个数n&#xff0c;求S中 > 给定数的最小的数。 例如&#xff1a;n 13&#xff0c;S中 > 13的最小的数是15&…

c语言可以将负数强制转换成正数吗_C语言笔记(一、概述)

1&#xff0e; C语言的特点 ①语言简洁、紧凑&#xff0c;使用方便、灵活。共有&#xff13;&#xff12;个关键字(也称保留字)&#xff0c;&#xff19;种控制语句。 ②运算符丰富&#xff0c;共有&#xff13;&#xff14;种运算符。 ③数据结构丰富&#xff0c;数据类型有&a…