poj 2226 Muddy Fields(二分图最小点覆盖)

B - Muddy Fields

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

Submit Status Practice POJ 2226

Description

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.

题意:给一张地图,其中有的点有水洼,要用木板把它们覆盖,求最小的木板数量(横着或者纵向)。

思路:

二分图中,选取最少的点数,使这些点和所有的边都有关联(把所有的边的覆盖),叫做最小点覆盖。
把每段连续的横水洼看成集合A中的点,每段连续的纵水洼看成集合B中的点,中间的交点看成连线,
因为每个有水单元必须覆盖,所以所连的2个单元至少有一个被覆盖。
所以求最小点覆盖。思路很巧妙。

而最小点覆盖 = 最大匹配数

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <string>
 5 #include <queue>
 6 #include <cstring>
 7 #include <vector>
 8 using namespace std;
 9 #define maxn 510
10 int R, C;
11 int h[maxn][maxn], z[maxn][maxn];
12 char mp[55][55];
13 int line[maxn], vis[maxn];
14 int cnth, cntz, ans;
15 vector <int> q[maxn];
16 void init(){
17     memset(h, 0, sizeof(h));
18     memset(z, 0, sizeof(z));
19     memset(q, 0, sizeof(q));
20     cnth = 1;
21     for(int i = 1; i <= R; i++){
22         for(int j = 1; j <= C; j++){
23             if(mp[i][j] == ‘*‘) h[i][j] = cnth;
24             if(mp[i][j] == ‘*‘ && mp[i][j+1] != ‘*‘) cnth++;
25
26         }
27     }
28
29     cntz = 1;
30     for(int i = 1; i <= C; i++){
31         for(int j = 1; j <= R; j++){
32             if(mp[j][i] == ‘*‘) z[j][i] = cntz;
33             if(mp[j][i] == ‘*‘ && mp[j+1][i] != ‘*‘) cntz++;
34         }
35     }
36
37     for(int i = 1; i <= R; i++){
38         for(int j = 1; j <= C; j++){
39             if(mp[i][j] == ‘*‘){
40                 q[h[i][j]].push_back(z[i][j]);
41             }
42         }
43     }
44 }
45 bool find(int x){
46     for(int i = 0; i < q[x].size(); i++){
47         if(!vis[ q[x][i] ] ){
48             vis[ q[x][i] ] = 1;
49             if(!line[q[x][i]] || find(line[q[x][i]])){
50                 line[q[x][i]] = x;
51                 return true;
52             }
53         }
54     }
55     return false;
56 }
57 void hungry(){
58     ans = 0;
59     memset(line, 0, sizeof(line));
60     for(int i = 1; i < 510; i++){
61         memset(vis, 0, sizeof(vis));
62         if(find(i)) ans++;
63     }
64     printf("%d\n", ans);
65
66 }
67 int main(){
68     while(~scanf("%d%d", &R, &C)){
69         memset(mp, ‘-1‘, sizeof(mp));
70         for(int i = 1; i <= R; i++){
71             for(int j = 1; j <= C; j++) cin>>mp[i][j];
72         }
73         init();
74         hungry();
75     }
76
77
78     return 0;
79 }

poj 2226 Muddy Fields(二分图最小点覆盖),布布扣,bubuko.com

时间: 2024-10-10 09:36:45

poj 2226 Muddy Fields(二分图最小点覆盖)的相关文章

POJ - 2226 Muddy Fields 二分图 最小点覆盖

题目大意:有一个n * m 大的牧场,牧场的土地分为两种,一种是很泥泞的,一种是相对比较干燥的 因为牧场里面的动物不喜欢泥泞的地方,所以牧场主想用些东西把这些泥泞的地方盖起来. 牧场主用一种宽度为1,长度不限的材料来覆盖这些泥泞的地方 问至少需要使用多少次这种材料,才可以把所有泥泞的地方盖起来 解题思路:刚开始没审对题目,上面所写的就是我刚开始认为的题意,所以我定势思维,以为这题和POJ - 3041 Asteroids一样,所以WA了两发 后来仔细看了一下,看漏了一个条件,那就是不能把相对干燥

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

Description 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

poj 2226 Muddy Fields(最小点覆盖)

题意: M*N的矩阵,每个格不是*就是#.     *代表水坑,#代表草地. 农民要每次可以用一块宽为1,长不限的木板去铺这个矩阵.要求这块木板不能覆盖草地.木板可以重复覆盖(即一块木板与另一块木板有交叉重叠的部分). 问农民最少需要操作多少次可以覆盖所有的水坑. 思路 : 与Battle Ships那题非常像,代码也几乎一样. 对于每一行,可以分成一段一段的水坑,将其视为一个一个点,作为左部X集合中的点. 对于每一列同理. 对于每一个水坑,将其看作一条线,将其在左部X集合中的位置和在右部Y集合

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

1 /* 2 题意:用木板盖住泥泞的地方,不能盖住草.木板任意长!可以重叠覆盖! '*'表示泥泞的地方,'.'表示草! 3 思路: 4 首先让我们回忆一下HDU 2119 Matrix这一道题,一个矩阵中只有0, 1,然后让我们通过选择一行,或者 5 是一列将其所在行的或者所在列的 1全部删掉,求出最少需要几步? 6 7 这道题的思路就是:将行标 和 列标值为1的建立一条边!通过匈牙利算法可以得到这个二分图的最大匹配数 8 最大匹配数==最小顶点覆盖数!最小顶点覆盖就是用最少的点覆盖了这个二分图

POJ 2226 Muddy Fields(二分匹配 巧妙的建图)

题目链接:http://poj.org/problem?id=2226 Description 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 co

POJ - 1325 Machine Schedule 二分图 最小点覆盖

题目大意:有两个机器,A机器有n种工作模式,B机器有m种工作模式,刚开始两个机器都是0模式,如果要切换模式的话,机器就必须的重启 有k个任务,每个任务都可以交给A机器的i模式或者B机器的j模式完成,问要重启多少次机器才能完成任务 解题思路:两个机器的点分为两个点集,点集之间的关系就是任务了,要将所有任务都完成,就要将所有边都覆盖掉,所以就是求最小点覆盖了. 这里有一个点要注意,如果所有任务中都有一个0,那么机器就不用重启了,重启次数就为0了(因为刚开始都是0) #include<cstdio>

poj 2226 二分图 最小点覆盖 , 最大流

题目就是问如何用最小的板覆盖所有的草地.可以横着放,也可以竖着放,允许一个草地放多个点. 建图方法就是 每个横向的草地作为X,纵向连续的草地作为Y.     X连接Y的边表示,  这里有他们的公共点.. 很显然,覆盖所有草地,就是覆盖所有的边 ,二分图中,最小点覆盖 = 最大匹配 = =其实如果存在一条边未被选中的节点覆盖,则必然存在一条对应的增广路径 //tpl //ipqhjjybj_tpl.h //header.h #include <cstdio> #include <cstdl

POJ2226 Muddy Fields(二分图最小点覆盖集)

题目给张R×C的地图,地图上*表示泥地..表示草地,问最少要几块宽1长任意木板才能盖住所有泥地,木板可以重合但不能盖住草地. 把所有行和列连续的泥地(可以放一块木板铺满的)看作点且行和列连续泥地分别作为XY部,每一块泥地看作边.这样就构造出了一个二分图. 那么,问题就是在这个二分图中就是选出最少的点覆盖所有的边,即二分图最小点覆盖集,而二分图最小点覆盖集=二分图最大匹配. 1 #include<cstdio> 2 #include<cstring> 3 #include<qu

Asteroids POJ - 3041 二分图最小点覆盖

Asteroids POJ - 3041 Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape of an N x N grid (1 <= N <= 500). The grid contains K asteroids (1 <= K <= 10,000), which are conveniently located at the lattice point