题目链接:http://poj.org/problem?id=2226

  这题是POJ 3041的升级版本,很有意思,要求木板不能盖在草地上。那么这里我们可以把每行一连续‘*’的看做行,把每列连续的‘*’看做列,那么在建模就是POJ 3041的原题了。

  看一个例子:

    3 3                              X集合       Y集合

    .*.                               010          020

    ***      ———>             222          123

    .*.                               033          020

  那么再根据X,Y集合连边即可。

  要覆盖图中所有的点,即二分图中的边,那么就是最小点集覆盖了。

 1 //STATUS:G++_AC_16MS_1760KB
 2 #include<stdio.h>
 3 #include<stdlib.h>
 4 #include<string.h>
 5 #include<math.h>
 6 #include<iostream>
 7 #include<string>
 8 #include<algorithm>
 9 #include<vector>
10 #include<queue>
11 #include<stack>
12 using namespace std;
13 #define LL long long
14 #define Max(a,b) ((a)>(b)?(a):(b))
15 #define Min(a,b) ((a)<(b)?(a):(b))
16 #define mem(a,b) memset(a,b,sizeof(a))
17 #define lson l,mid,rt<<1
18 #define rson mid+1,r,rt<<1|1
19 const int MAX=60,INF=200000000;
20
21 char map[MAX][MAX];
22 int g[510][510],vis[510],y[510],grax[MAX][MAX],gray[MAX][MAX];
23 int n,m,cou;
24
25 void getg()
26 {
27     mem(grax,0);
28     mem(gray,0);
29     int i,j,k;
30     for(k=i=0;i<n;i++){
31         for(j=0;j<m;j++){
32             if(map[i][j]=='*'){
33                 k++;
34                 for(;map[i][j]=='*';j++)
35                     grax[i][j]=k;
36             }
37         }
38     }
39     cou=Max(cou,k);
40     for(k=j=0;j<m;j++){
41         for(i=0;i<n;i++){
42             if(map[i][j]=='*'){
43                 k++;
44                 for(;map[i][j]=='*';i++)
45                     gray[i][j]=k;
46             }
47         }
48     }
49     cou=Max(cou,k);
50     for(i=0;i<n;i++){
51         for(j=0;j<m;j++){
52             if(grax[i][j] && gray[i][j])
53                 g[grax[i][j]][gray[i][j]]=1;
54         }
55     }
56 }
57
58 int dfs(int u)
59 {
60     int v;
61     for(v=1;v<=cou;v++){
62         if(g[u][v] && !vis[v]){
63             vis[v]=1;
64             if(!y[v] || dfs(y[v])){
65                 y[v]=u;
66                 return 1;
67             }
68         }
69     }
70     return 0;
71 }
72
73 int main()
74 {
75 //  freopen("in.txt","r",stdin);
76     int i,j,ans;
77     while(~scanf("%d%d",&n,&m))
78     {
79         ans=cou=0;
80         mem(y,0);
81         mem(g,0);
82         for(i=0;i<n;i++){
83             scanf("%s",map[i]);
84         }
85
86         getg();
87         for(i=1;i<=cou;i++){
88             mem(vis,0);
89             if(dfs(i))ans++;
90         }
91
92         printf("%d\n",ans);
93     }
94 }

转载于:https://www.cnblogs.com/zhsl/archive/2012/11/19/2776783.html

POJ-2226 Muddy Fields 最小点集覆盖相关推荐

  1. POJ 2226 Muddy Fields 最小点覆盖+加建图(好题)

    题目链接 题目一看就是最小点覆盖,这道题与POJ - 3041 算是一类题,但是3041算是一道十分裸的,因为删除的是整行或者整列,所以图其实是现成的,但是本题的难点就在如何建图. 思路:首先还是尽量 ...

  2. POJ - 2226 Muddy Fields(最小点覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:给出一个n*m的地图,地图中'*'代表泥地,'.'代表空地,现在我们有两种木板,一种可以覆盖一行中的任意长度,我们成为行木板,另一种可以覆盖一列中的任意长度,我们成为列木 ...

  3. poj 2226 Muddy Fields 最小顶点覆盖

    题目链接:http://poj.org/problem?id=2226 这道题跟上一道很相似不同之处在于这里不是整行或者整列的删,而是连续的几个可以一起删,不连的不能删,这就要对原图进行处理,对原有的 ...

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

    题意:一片r*c的地,有些地方是泥地,需要铺地板.这些地板宽1,长无限,但只能铺在泥地上不能压到其他地方,问你铺满所有泥地最少几块 思路:我们把一行中连续的泥地看成整体,并把所有横的整体里的点编成一个 ...

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

    1 /* 2 题意:用木板盖住泥泞的地方,不能盖住草.木板任意长!可以重叠覆盖! '*'表示泥泞的地方,'.'表示草! 3 思路: 4 首先让我们回忆一下HDU 2119 Matrix这一道题,一个矩 ...

  6. POJ 1325 Machine Schedule(二分图最小点集覆盖)

    题目链接:http://poj.org/problem?id=1325 题意:A机器有n个模式,B机器有m个模式,有k个任务,第i个任务可以用A机器的ai模式或者B机器的bi模式,换模式需要重启,开始 ...

  7. POJ 1422 Air Raid (最小路径覆盖)

    题意 给定一个有向图,在这个图上的某些点上放伞兵,可以使伞兵可以走到图上所有的点.且每个点只被一个伞兵走一次.问至少放多少伞兵. 思路 裸的最小路径覆盖. °最小路径覆盖 [路径覆盖]在一个有向图G( ...

  8. poj 2594 Treasure Exploration 最小路径覆盖

    题目链接:http://poj.org/problem?id=2594 建图很重要!!! 大致题意: 给出一个由n个顶点m条边组成的有向无环图.求最少可以同时存在多少路径,使得这些路径可以覆盖所有的点 ...

  9. POJ - 2594 Treasure Exploration(最小路径覆盖-二分图最大匹配+传递闭包)

    题目链接:点击查看 题目大意:给出一个有向图,现在需要让最少的机器人沿着图遍历所有点,求出最少需要机器人的数量,注意每个点可以重复遍历 题目分析:因为要遍历所有点,所以还是变成了二分图的最小路径覆盖问 ...

最新文章

  1. Java排序算法之归并排序
  2. 皮一皮:论一件艺术品的诞生...
  3. poj 2506 Tiling (递推)
  4. oracle查询案例,2道经典的oracle查询案例
  5. Hexo 博客自定义一个不使用主题模板渲染的独立页面
  6. 1.13 编程基础之综合应用 10 判决素数个数 python
  7. 轻量化网络:SqueezeNext
  8. MySQLl数据量不一样,导致走不同的索引
  9. arm 服务器cpu型号,挑战英特尔ARM Tilera发布36核服务器CPU
  10. 电脑快速截屏(缺少PrtScr键)
  11. 南航计算机考研调剂,南京航空航天大学接受调剂生的时间定了,南航读研就业会咋样...
  12. 【EXCEL批量查询手机号归属地小技巧】很多网友想看excel怎么批量查询手机号归属地,今天它来了
  13. 程序员可以培养的第二技能有哪些?
  14. 计算机网络实验-路由器IP地址配置及直连网络和ARP协议分析
  15. Golang——从入门到放弃
  16. 解决IE浏览器没有网络的情况
  17. 用HTML和CSS制作一个网页
  18. leetcode844 比较含退格的字符串(python)
  19. Wireshark搜索关键字内容
  20. MCR和MRC汇编指令

热门文章

  1. 用RT Server Customizer定制Windows 2008 R2安装光盘
  2. 对于已经加入版本控制的文件,我们可以强制忽略文件git update-index --assume-unchanged local.properties...
  3. [短评]企业裁员行为对整个社会的正面意义
  4. 获取Kubernetes容器上下文环境
  5. php 判断赋值 简写,PHP IF 判断简写
  6. MySQL之mysqldump的使用
  7. php 调用vs2013 dll文件,vs2015 肿么添加dll文件
  8. mysql后天命令查下显示_MySQL命令
  9. 2020-08-09
  10. 计算机病毒不会直接危害计算机用户的健康,北京语言大学入学测试机考(高起点)计算机基础模拟题...