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;
}

poj Muddy Fields的更多相关文章

  1. POJ Muddy Fields 泥泞的牧场 二分图

    Muddy Fields Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13235   Accepted: 4879 汪星人 ...

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

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

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

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

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

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

  5. poj 2226 Muddy Fields (二分匹配)

    Muddy Fields Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7340   Accepted: 2715 Desc ...

  6. Muddy Fields

     Muddy Fields Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submi ...

  7. bzoj 1735: [Usaco2005 jan]Muddy Fields 泥泞的牧场 最小点覆盖

    链接 1735: [Usaco2005 jan]Muddy Fields 泥泞的牧场 思路 这就是个上一篇的稍微麻烦版(是变脸版,其实没麻烦) 用边长为1的模板覆盖地图上的没有长草的土地,不能覆盖草地 ...

  8. BNUOJ 2345 Muddy Fields

    Muddy Fields Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on PKU. Original I ...

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

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

随机推荐

  1. 【Cocos2D研究院之游戏开发】

    http://www.xuanyusong.com/archives/category/ios/cocos2d_game 分类目录归档:[Cocos2D研究院之游戏开发]   201211-19 Co ...

  2. poj 2546(两圆公共面积)

    Circular Area Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5682   Accepted: 2225 Des ...

  3. android okhttp3

    一. 传键值对 public String webLogin() { String responseData = null; OkHttpClient client = new OkHttpClien ...

  4. Python与数据库[2] -> 关系对象映射/ORM[2] -> 建立声明层表对象的两种方式

    建立声明层表对象的两种方式 在对表对象进行建立的时候,通常有两种方式可以完成,以下是两种方式的建立过程对比 首先导入需要的模块,获取一个声明层 from sqlalchemy.sql.schema i ...

  5. poj1743(后缀数组)

    poj1743 题意 给出一个数字序列(串),现在要去寻找一个满足下列条件的子串: 长度不小于 5 存在重复的子串(如果把一个子串的所有数字都加上或减去一个值,与另一子串的数字对应相同,我们称它们重复 ...

  6. hdu5884(多叉哈夫曼树)

    hdu5884 题意 给出 n 个数,每次选择不超过 k 个数合并(删掉这些数,加入这些数的和),花费为合并的这些数的和,要求最后只剩下一个数,问 k 最小取多少. 分析 二分 k,合并数的时候可以按 ...

  7. 内连接(INNER JOIN)

    内连接组合两张表,并且基于两张表中的关联关系来连接它们.使用内连接需要指定表中哪些字段组成关联关系,并且需要指定基于什么条件进行连接.内连接的语法如下: INNER JOIN table_name O ...

  8. Delphi创建开机启动项的方法示例

    Delphi可以通过创建开机启动项键值的方法,将程序添加到开机启动项中.通过本实例代码就可以为您的程序添加到快速启动中,随着Windows一起启动,开机即运行的程序.该实例代码简单,主要是通过添加注册 ...

  9. NSPredicate 应用 --数组如何一键去重,如何一行代码筛选,请慢慢看来

    1.去重 NSArray * uniqueVarValueArray= [origArray valueForKeyPath:@"@distinctUnionOfObjects.VarKey ...

  10. 【POI】导出excel文件,不生成中间文件,直接将内存中的数据创建对象下载到浏览器

    不是从InputStream中read,然后outputStream再write @RequestMapping("download4Excel") public void dow ...