poj 2226 Muddy Fields 最小顶点覆盖
题目链接:http://poj.org/problem?id=2226
这道题跟上一道很相似不同之处在于这里不是整行或者整列的删,而是连续的几个可以一起删,不连的不能删,这就要对原图进行处理,对原有的图行由上到下,列由左到右进行编号,作为x集合,在同一行且连续的编号一样,然后对原有的图列由左到右,行由上到下重新编号,作为y集合。之后就是二分图求最大匹配。
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 const int MAX=55; 6 int visit[20*MAX]; 7 int map[MAX][MAX]; 8 int res[20*MAX][20*MAX]; 9 int use[20*MAX]; 10 int n,m,xx,yy; 11 int solve(int x) 12 { 13 int i; 14 for(i=1;i<=yy;i++) 15 if(res[x][i]&&!visit[i]) 16 { 17 visit[i]=1; 18 if(use[i]==-1||solve(use[i])) 19 { 20 use[i]=x; 21 return 1; 22 } 23 } 24 return 0; 25 } 26 int match() 27 { 28 int i,count=0; 29 for(i=1;i<=xx;i++) 30 { 31 memset(visit,0,sizeof(visit)); 32 if(solve(i))count++; 33 } 34 return count; 35 } 36 void build() 37 { 38 int i,j,k; 39 k=0; 40 for(i=1;i<=n;i++) 41 for(j=1;j<=m;) 42 if(map[i][j]){ 43 k++; 44 while(j<=m&&map[i][j]) 45 map[i][j++]=k; 46 } 47 else j++; 48 xx=k; 49 k=0; 50 for(j=1;j<=m;j++) 51 for(i=1;i<=n;) 52 if(map[i][j]){ 53 k++; 54 while(i<=n&&map[i][j]) 55 { 56 res[map[i][j]][k]=1; 57 i++; 58 } 59 } 60 else i++; 61 yy=k; 62 } 63 int main() 64 { 65 int i,j; 66 char ch; 67 while(scanf("%d%d",&n,&m)!=EOF) 68 { 69 memset(map,0,sizeof(map)); 70 memset(res,0,sizeof(res)); 71 memset(use,-1,sizeof(use)); 72 for(i=1;i<=n;i++) 73 for(j=1;j<=m;j++) 74 { 75 //scanf("%c",&ch); 76 cin>>ch; 77 if(ch=='*') 78 { 79 map[i][j]=1; 80 } 81 } 82 build(); 83 printf("%d\n",match()); 84 } 85 return 0; 86 }
转载于:https://www.cnblogs.com/zhaoguanqin/archive/2012/05/07/2488853.html
poj 2226 Muddy Fields 最小顶点覆盖相关推荐
- POJ 2226 Muddy Fields 最小点覆盖+加建图(好题)
题目链接 题目一看就是最小点覆盖,这道题与POJ - 3041 算是一类题,但是3041算是一道十分裸的,因为删除的是整行或者整列,所以图其实是现成的,但是本题的难点就在如何建图. 思路:首先还是尽量 ...
- POJ - 2226 Muddy Fields(最小点覆盖-二分图最大匹配)
题目链接:点击查看 题目大意:给出一个n*m的地图,地图中'*'代表泥地,'.'代表空地,现在我们有两种木板,一种可以覆盖一行中的任意长度,我们成为行木板,另一种可以覆盖一列中的任意长度,我们成为列木 ...
- poj 2226 Muddy Fields(合理建图+二分匹配)
1 /* 2 题意:用木板盖住泥泞的地方,不能盖住草.木板任意长!可以重叠覆盖! '*'表示泥泞的地方,'.'表示草! 3 思路: 4 首先让我们回忆一下HDU 2119 Matrix这一道题,一个矩 ...
- POJ 2226 Muddy Fields(最小点覆盖)题解
题意:一片r*c的地,有些地方是泥地,需要铺地板.这些地板宽1,长无限,但只能铺在泥地上不能压到其他地方,问你铺满所有泥地最少几块 思路:我们把一行中连续的泥地看成整体,并把所有横的整体里的点编成一个 ...
- poj 1325 Machine Schedule 最小顶点覆盖
题意 两个机器A,B, 分别有 N,M个工作模式, K个作业,可以在( Ai, Bj ) 模式下工作. 机器最初在模式0下. 问最小的 切换模式次数. 解题思路 A, B 两个天然二分图顶点集合, ...
- POJ-2226 Muddy Fields 最小点集覆盖
题目链接:http://poj.org/problem?id=2226 这题是POJ 3041的升级版本,很有意思,要求木板不能盖在草地上.那么这里我们可以把每行一连续'*'的看做行,把每列连续的'* ...
- 【最小点覆盖】POJ 2226:Muddy Fields
一.题目内容 POJ 2226 原题地址 二.题意解释 告诉你一个矩阵,让你用1 * x (x 为任意值) 的木板去铺符号* 可以覆盖 问最少多少木板能够把所有的*覆盖掉 三.代码及注释 #inclu ...
- poj Muddy Fields
Muddy Fields 原题去我创的专题里找.在文件夹首页. 题目: 给出N*M矩阵.当中*表示泥土,.表示小草.要你用最少的木板把泥土覆盖. 木板长度不限,可是仅仅能水平和竖直. 行列式二分匹配配 ...
- POJ 2226 二分图最小点覆盖
题意 传送门 POJ 2226 题解 每个泥泞地需要被至少一块横着或竖着的板子覆盖,那么预处理出不能覆盖草地的限制下,所有尽可能长的横板子与竖板子.对可覆盖同一块泥泞地的 222 块板子连边,则转化为 ...
最新文章
- 体质测试java代码_求java代码,要求做一个测试类,实现以下功能之一。最好三个功能都有。...
- linux su、su -和sudo的区别
- 第一个程序实现登录功能,密码输错三次封账号。
- Netlink 介绍(译)
- RabbitMQ快速入门--简单队列模型
- 海南首例供港造血干细胞志愿者启程赴广东捐献
- Scheduled SQL: SLS 大规模日志上的全局分析与调度
- java 自定义map_自定义写实现java中map中的功能(简易)
- 解决sklearn.metrics指标报错ValueError: Target is multiclass but average=‘binary‘. Please choose anothe...
- NAT负载均衡_ftp
- random number in groovy
- Tomcat9版本不支持jsp处理PUT,DELETE之外的请求的解决方案(405方法不允许)
- Linux网络基础番外篇(IP、MAC、TCP)
- 用c语言编程图书管理系统,C语言图书管理系统简洁版
- 【读书】卡勒德·胡赛尼《群山回唱》 摘录
- 使用HTML编写浣溪沙,浣溪沙_巅峰Hacker_新浪博客
- 【论文翻译】Mastering the game of Go without human knowledge (无师自通---在不借助人类知识的情况下学会围棋)
- react 页面跳转(下一页,返回上一页)
- 【已解决】MAC OS上teamviewer商业用途中断连接
- java设计模式(13-19节)