poj 2226 Muddy Fields(合理建图+二分匹配)
/*
题意:用木板盖住泥泞的地方,不能盖住草。木板任意长!可以重叠覆盖! '*'表示泥泞的地方,'.'表示草!
思路:
首先让我们回忆一下HDU 2119 Matrix这一道题,一个矩阵中只有0, 1,然后让我们通过选择一行,或者
是一列将其所在行的或者所在列的 1全部删掉,求出最少需要几步? 这道题的思路就是:将行标 和 列标值为1的建立一条边!通过匈牙利算法可以得到这个二分图的最大匹配数
最大匹配数==最小顶点覆盖数!最小顶点覆盖就是用最少的点覆盖了这个二分图的所有的边,然后去掉这些
最小覆盖中的顶点就可以去掉所有的边,也就是所有的 1都去掉了! 那么这道题该怎么办呢?其实和上面的思路差不多,只不过是不能在原图上解题!这道题每一行或者每一列
都有限制的因素,就是草地,覆盖泥泞的地方时不能覆盖草地,所以要想办法忽略草地的影响! 解决方法:连通块的思路
如果一个连通区域的左右两侧无法延伸则为行连通块儿,上下无法延伸则为列连通块儿,把行连通块儿作为X集合,列连通块儿作为Y集合,则X与Y相连得到的边就代表所要覆盖的 泥泞区域。即可用匈牙利算法求出覆盖所有泥泞区域所需要的最少连通块儿。
1,现将每一行的不连在一起的泥泞土地赋给不同的编号(从1...cntR开始),也就是如果忽略
草地的话,泥泞的地方一共有cntR个行连通块!
2,同理每一列按照每一行的操作, 共有cntC个列连通块!
这样结题思路就和上面的那一道题一样了..... g[i][j]=='*' 那么aR[i][j]就是该点新的行标, aC[i][j]就是该点行的列标
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#define M 55
#define N 1000
using namespace std;
vector<int>v[N];
char g[M][M];
int vis[N];
int linker[N];
int aR[M][M], aC[M][M];
int n, m; bool dfs(int u){
int len=v[u].size();
for(int i=; i<len; ++i){
int vu=v[u][i];
if(!vis[vu]) {
vis[vu]=;
if(!linker[vu] || dfs(linker[vu])){
linker[vu]=u;
return true;
}
}
}
return false;
} int main(){
while(scanf("%d%d", &n, &m)!=EOF){
int cntR=, cntC=;
for(int i=; i<=n; ++i)
scanf("%s", g[i]+);
for(int i=; i<=n; ++i)
for(int j=; j<=m; ++j)
if(g[i][j]=='*'){
aR[i][j]=cntR;
if(j+>m || g[i][j+]!='*')
++cntR;
}
for(int j=; j<=m; ++j)
for(int i=; i<=n; ++i)
if(g[i][j]=='*'){
aC[i][j]=cntC;
if(i+>n || g[i+][j]!='*')
++cntC;
}
for(int i=; i<=n; ++i)
for(int j=; j<=m; ++j)
if(g[i][j]=='*')
v[aR[i][j]].push_back(aC[i][j]); int ans=;
memset(linker, , sizeof(linker));
for(int i=; i<cntR; ++i){
memset(vis, , sizeof(vis));
if(dfs(i)) ++ans;
}
printf("%d\n", ans);
for(int i=; i<cntR; ++i)
v[i].clear();
}
return ;
}
poj 2226 Muddy Fields(合理建图+二分匹配)的更多相关文章
- POJ 2226 Muddy Fields(最小顶点覆盖)
POJ 2226 Muddy Fields 题目链接 题意:给定一个图,要求用纸片去覆盖'*'的位置.纸片能够重叠.可是不能放到'.'的位置,为最少须要几个纸片 思路:二分图匹配求最小点覆盖.和放车那 ...
- poj 2226 Muddy Fields (转化成二分图的最小覆盖)
http://poj.org/problem?id=2226 Muddy Fields Time Limit: 1000MS Memory Limit: 65536K Total Submissi ...
- poj 2226 Muddy Fields(最小覆盖点+构图)
http://poj.org/problem?id=2226 Muddy Fields Time Limit: 1000MS Memory Limit: 65536K Total Submissi ...
- POJ 2226 Muddy Fields 二分图(难点在于建图)
题意:给定一个矩阵和它的N行M列,其中有一些地方有水,现在有一些长度任意,宽为1的木板,要求在板不跨越草,用一些木板盖住这些有水的地方,问至少需要几块板子? 思路:首先想到如果没有不准跨越草的条件则跟 ...
- poj 2226 Muddy Fields (二分匹配)
Muddy Fields Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7340 Accepted: 2715 Desc ...
- [POJ] 2226 Muddy Fields(二分图最小点覆盖)
题目地址:http://poj.org/problem?id=2226 二分图的题目关键在于建图.因为“*”的地方只有两种木板覆盖方式:水平或竖直,所以运用这种方式进行二分.首先按行排列,算出每个&q ...
- poj 2226 Muddy Fields(最小点覆盖+巧妙构图)
Description Rain has pummeled the cows' field, a rectangular grid of R rows and C columns (1 <= ...
- POJ - 2226 Muddy Fields (最小顶点覆盖)
*.*. .*** ***. ..*. 题意:有一个N*M的像素图,现在问最少能用几块1*k的木条覆盖所有的 * 点,k为>=1的任意值. 分析:和小行星那题很像.小行星那题是将一整行(列)看作 ...
- poj 2226 Muddy Fields (二分图)
大意:给定n*m网格, 每个格子为泥地或草地, 可以用一些长度任意宽度为1的木板盖住泥地, 要求不能盖到草地, 求最少要多少块木板能盖住所有泥地. 最小点覆盖板子题, 建图跑最大匹配即可. #incl ...
随机推荐
- 一款免费支持PDF、word、excel、PPT、jpeg之间互转线上软件
偶然发现的一款免费支持PDF.word.excel.PPT.jpeg之间互转,支持合并pdf.加密解密PDF的线上软件,首先声明,不是广告党,我自己试用过,确实是目前我用过最好用的,如果有朋友有更好的 ...
- java代码中获取classpath路径
Javaweb工程中,有时候需要自己手动的去读取classpath下面的配置文件,这里总结一点读取classpath路径的方法,分享一下. 方法一: String path = Test.class. ...
- disconf使用
1.创建app,确定version 2.创建配置文件redis.config 3.选择app下env环境,上传redis.config到disconf 4.创建disconf.properties到c ...
- MyEclipse10优化
Myeclipse10 优化设置 一.myeclipse字体设置 Window->Preferences->General->Appearance->Colors and Fo ...
- maven之上传新的jar包
今天要求上传若干jar包到maven服务器,师父曾经真的是一步一步点给我看.然后我特喵的忘记了,师父又一步一步点给我看,所以我记录下来,以后留用. 步骤如下,如图所示: 1)先在首页查询下将要上传的j ...
- python-getattr
getattr(object, name[, default]) Return the value of the named attribute of object. name must be a ...
- 扫描二维码判断移动设备(Android/ios),以及判断是否微信端扫描
<section class="download"> <a href="apk地址" class="android" st ...
- asp.net WebApi and protobuff
protobuff 是谷歌开发的,在性能上要比Json xml好很多,对性能要求比较高的时候这个是一个不错的选择,但是这个目前只是一个序列化反序列化的东西,以前原生的只有几种语言的现在在github ...
- Android(蓝牙)
因近期项目需求调试了Android蓝牙通讯接口,主要是两个终端作为服务端和客户端的通信,本文将部分重要知识点记录如下. 蓝牙是短距离无线通信,通常分经典蓝牙和低功耗蓝牙(即蓝牙4.0),两类蓝牙协议各 ...
- 【吉光片羽】MVC 导出Word的两种方式
1.直接将Html转成Word.MVC自带FileResult很好用.Html中我们也可以嵌入自己的样式. html: <div id="target"> <st ...