题目链接:

https://vjudge.net/problem/POJ-2226

题目大意:

用宽度为1长度不限的木板将水洼‘*’盖住而不盖住草‘.'

Sample Input

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

Sample Output

4

解题思路:

这道题的构图方法十分巧妙,如果有连续的水洼,假设是横排的,那么这几个连续的水洼可以拿一个板子来覆盖,同样,如果竖排也有连续的水洼,那么也可以拿一个板子来覆盖。这样,当一个水洼既可以拿横着的板子,也可以拿竖着的板子覆盖时,就是相交了。那么这个交线就代表了一个水洼,它既可以被横着盖,也可以被竖着盖。现在我们把所有横排的水洼作为1个水洼需要1个木板,竖着的也同理。

有两种覆盖的方法,一种为横着盖一种为竖着盖覆盖后可转化为下图形式

横着盖:(图中数字表示用的是第几块木板)
1.2.
.333
444.
. . 5.
将这些点加入到X序列中
 
竖着盖:
1.2.
.324
532.
. . 2.
将这些点加入到Y序列中
 
将图中水洼进行编号一共有九个水洼
1.2.
.345
678.
. . 9.
9号水洼(5, 2)表示九号水洼可由横着的5号木板覆盖也可以由竖着的2号木板覆盖,5号木板和2号木板之间就有一条线

这样就组成一个二分图,最后求最小的顶点覆盖。就是等于保证每个泥地都被横着的木板或者竖着的木板覆盖了。
 #include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std;
const int maxn = + ; int cx[maxn], cy[maxn];
bool vis[maxn];
vector<int>G[maxn];
int x, y;
//x表示二分图X部的点数
//y表示二分图Y部的点数
bool dfs(int u)
{
for(int i = ; i < G[u].size(); i++)
{
int v = G[u][i];
if(!vis[v])//如果该点还没进入增广路
{
vis[v] = ;//加入增广路
if(cy[v] == - || dfs(cy[v]))
{
cx[u] = v;
cy[v] = u;
return ;
}
}
}
return ;
} int maxmatch()
{
int ans = ;
memset(cx, -, sizeof(cx));
memset(cy, -, sizeof(cy));
for(int i = ; i <= x; i++)
{
if(cx[i] == -)
{
memset(vis, , sizeof(vis));
ans += dfs(i);
}
}
return ans;
}
char Map[][];
int cnt[][], n, m;
void Build()//建图巧妙
{
int a[][], b[][];
memset(a, , sizeof(a));
memset(b, , sizeof(b));
//木板横着放
x = , y = ;
for(int i = ; i < n; i++)
{
for(int j = ; j < m; j++)
{
if(Map[i][j] == '*')
{
if(Map[i][j - ] == '*')
a[i][j] = a[i][j - ];
else a[i][j] = ++x;
}
}
}
//木板竖着放
for(int j = ; j < m; j++)
{
for(int i = ; i < n; i++)
{
if(Map[i][j] == '*')
{
if(Map[i - ][j] == '*')
b[i][j] = b[i - ][j];
else b[i][j] = ++y;
//cout<<a[i][j]<<" "<<b[i][j]<<endl;
//建边
G[a[i][j]].push_back(b[i][j]);
}
}
}
}
int main()
{
cin >> n >> m;
for(int i = ; i < n; i++)
{
cin >> Map[i];
}
Build();
cout<<maxmatch()<<endl;
return ;
}

POJ-2226 Muddy Fields---二分图匹配+巧妙构图的更多相关文章

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

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

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

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

  3. POJ 2226 Muddy Fields 二分图(难点在于建图)

    题意:给定一个矩阵和它的N行M列,其中有一些地方有水,现在有一些长度任意,宽为1的木板,要求在板不跨越草,用一些木板盖住这些有水的地方,问至少需要几块板子? 思路:首先想到如果没有不准跨越草的条件则跟 ...

  4. poj 2226 Muddy Fields (二分图)

    大意:给定n*m网格, 每个格子为泥地或草地, 可以用一些长度任意宽度为1的木板盖住泥地, 要求不能盖到草地, 求最少要多少块木板能盖住所有泥地. 最小点覆盖板子题, 建图跑最大匹配即可. #incl ...

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

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

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

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

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

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

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

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

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

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

  10. poj 2226 Muddy Fields(水二分图)

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

随机推荐

  1. Hibernate单表映射学习笔记之一——hibernalnate开发环境配置

    1.什么是ORM? Object/Relationship Mapping:对象/关系映射 2.写SQL语句不好之处: (1)不同数据库使用的SQL语法不同(PL/SQL.T/SQL) (2)同样的功 ...

  2. 清北刷题冲刺 10-28 a.m

    立方数 (cubic) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是立方 ...

  3. HDFS高可用实现细节

    NameNode 高可用整体架构概述 在 Hadoop 1.0 时代,Hadoop 的两大核心组件 HDFS NameNode 和 JobTracker 都存在着单点问题,这其中以 NameNode ...

  4. python 3.x 安装问题及连接oracle数据库

    最近有用到python去处理一些问题,发现现在3已出来,遂用直接下3.7使用 发现问题还是有一点的 1. pip 会出现ssl问题 Could not install packages due to ...

  5. EcmaScript内置对象的属性与方法

  6. linux查看硬盘空间,删除大文件

    df -Phdu -h --max-depth=1du -sh /u02/weblogic/user_projects/domains/logsdu -sh /u02/mysqlfind / -siz ...

  7. Excel打印区域设置

    excel打印区域设置 在打印excel的时候,经常需要来设定打印区域,才能更好的打印我们所要的东西,那怎么设置了,这里做个记录,以备使用查看 1.首先选中你要打印的区域,拖动鼠标框选就可以.如图 选 ...

  8. 使用open live writer客户端写博客(亲测有效)

    博客都开了这么久了,才开始将资料上传,但是每次都要登录网页确实很麻烦,所以就用open live writer,使用起来真的是挺方便的,所以将我在安装配置时,发现的问题汇总起来以便日后再次碰到忘记怎么 ...

  9. Processes and Application Life Cycle

    进程的生命期 Android系统会尽量维持一个进程的生命,直到最终需要为新的更重要的进程腾出内存空间.为了决定哪个该杀哪个该留,系统会跟据运行于进程内的组件的和组件的状态把进程置于不同的重要性等级.当 ...

  10. No lease on /目录: File does not exist. [Lease. Holder: DFSClient_NONMAPREDUCE_-2059237550_1, pendingcreates: 8]错误及解决方法

    感觉程序员的世界真是一个变幻无常且精彩绝伦的世界,每次跑程序都会发现不一样的问题.今天跑MapReduce程序来统计邮箱次数时遇到了一个问题,明明一样的代码,别人能跑,我却跑不了.我相信,基本做这行的 ...