poj 2226 Muddy Fields(最小点覆盖)
题意:
M*N的矩阵,每个格不是*就是#。 *代表水坑,#代表草地。
农民要每次可以用一块宽为1,长不限的木板去铺这个矩阵。要求这块木板不能覆盖草地。木板可以重复覆盖(即一块木板与另一块木板有交叉重叠的部分)。
问农民最少需要操作多少次可以覆盖所有的水坑。
思路 :
与Battle Ships那题非常像,代码也几乎一样。
对于每一行,可以分成一段一段的水坑,将其视为一个一个点,作为左部X集合中的点。
对于每一列同理。
对于每一个水坑,将其看作一条线,将其在左部X集合中的位置和在右部Y集合中的位置连起来,代表这个水坑可以被那两块木板覆盖。
求二分图的最小点覆盖即可。(最小点覆盖:用最少的点【可以是左部的点,也可以是右部的点】,使得所有的边都至少有一个端点是被覆盖的)
代码:
int T,m,n;
char mapp[55][55];
char temp[55];
int row[55][55], col[55][55];
int cc1,cc2;
int cx[2505], cy[2505];
bool bmask[2505];
vector<int> graph[2505]; int findPath(int u){
int L=graph[u].size();
rep(i,0,L-1){
int v=graph[u][i];
if(!bmask[v]){
bmask[v]=true;
if(cy[v]==-1||findPath(cy[v])){
cy[v]=u;
cx[u]=v;
return 1;
}
}
}
return 0;
}
int MaxMatch(){
int ans=0;
rep(i,1,cc1) cx[i]=-1;
rep(i,1,cc2) cy[i]=-1;
rep(i,1,cc1) if(cx[i]==-1){
mem(bmask,false);
ans+=findPath(i);
}
return ans;
} int main(){
//freopen("test.in","r",stdin);
while(scanf("%d%d",&m,&n)!=EOF){
rep(i,0,m-1) scanf("%s",mapp[i]);
cc1=0, cc2=0;
mem(row,0); mem(col,0);
rep(i,0,m-1){
if(mapp[i][0]=='*') row[i][0]=++cc1;
rep(j,1,n-1) if(mapp[i][j]=='*'){
if(mapp[i][j-1]=='*') row[i][j]=cc1; else row[i][j]=++cc1;
}
} rep(j,0,n-1){
if(mapp[0][j]=='*') col[0][j]=++cc2;
rep(i,1,m-1) if(mapp[i][j]=='*'){
if(mapp[i-1][j]=='*') col[i][j]=cc2; else col[i][j]=++cc2;
}
}
rep(i,1,cc1) graph[i].clear();
rep(i,0,m-1) rep(j,0,n-1) if(mapp[i][j]=='*') graph[row[i][j]].push_back(col[i][j]); int dd=MaxMatch();
printf("%d\n",dd);
}
//fclose(stdin);
}
poj 2226 Muddy Fields(最小点覆盖)的更多相关文章
- POJ 2226 Muddy Fields (最小点覆盖集,对比POJ 3041)
题意 给出的是N*M的矩阵,同样是有障碍的格子,要求每次只能消除一行或一列中连续的格子,最少消除多少次可以全部清除. 思路 相当于POJ 3041升级版,不同之处在于这次不能一列一行全部消掉,那些非障 ...
- POJ - 2226 Muddy Fields (最小顶点覆盖)
*.*. .*** ***. ..*. 题意:有一个N*M的像素图,现在问最少能用几块1*k的木条覆盖所有的 * 点,k为>=1的任意值. 分析:和小行星那题很像.小行星那题是将一整行(列)看作 ...
- POJ 2226 Muddy Fields(最小顶点覆盖)
POJ 2226 Muddy Fields 题目链接 题意:给定一个图,要求用纸片去覆盖'*'的位置.纸片能够重叠.可是不能放到'.'的位置,为最少须要几个纸片 思路:二分图匹配求最小点覆盖.和放车那 ...
- poj 2226 Muddy Fields (转化成二分图的最小覆盖)
http://poj.org/problem?id=2226 Muddy Fields Time Limit: 1000MS Memory Limit: 65536K Total Submissi ...
- poj 2226 Muddy Fields(最小覆盖点+构图)
http://poj.org/problem?id=2226 Muddy Fields Time Limit: 1000MS Memory Limit: 65536K Total Submissi ...
- [POJ] 2226 Muddy Fields(二分图最小点覆盖)
题目地址:http://poj.org/problem?id=2226 二分图的题目关键在于建图.因为“*”的地方只有两种木板覆盖方式:水平或竖直,所以运用这种方式进行二分.首先按行排列,算出每个&q ...
- poj 2226 Muddy Fields(最小点覆盖+巧妙构图)
Description Rain has pummeled the cows' field, a rectangular grid of R rows and C columns (1 <= ...
- POJ 2226 Muddy Fields(最小点覆盖)题解
题意:一片r*c的地,有些地方是泥地,需要铺地板.这些地板宽1,长无限,但只能铺在泥地上不能压到其他地方,问你铺满所有泥地最少几块 思路:我们把一行中连续的泥地看成整体,并把所有横的整体里的点编成一个 ...
- POJ 2226 Muddy Fields (二分图匹配)
[题目链接] http://poj.org/problem?id=2226 [题目大意] 给出一张图,上面有泥和草地,有泥的地方需要用1*k的木板覆盖, 有草地的地方不希望被覆盖,问在此条件下需要的最 ...
随机推荐
- C++ windows 函数讲解(二)鼠标坐标
获得鼠标坐标: #include<bits/stdc++.h> #include<windows.h> using namespace std; int main() { PO ...
- 重学VUE——vue 常用指令有哪些?
一.什么是指令? 在 vue 中,指令以 v- 开头,是一种特殊的自定义行间属性.指令属性的预期值是一个表达式,指令的职责就是:表达式的值改变时,相应地将某些行为应用到DOM上.只有v-for是一个类 ...
- 学习PHP中的任意精度扩展函数
今天来学习的是关于数学方面的第一个扩展.对于数学操作来说,无非就是那些各种各样的数学运算,当然,整个程序软件的开发过程中,数学运算也是最基础最根本的东西之一.不管你是学得什么专业,到最后基本上都会要学 ...
- Java基础系列(21)- dowhile循环
do-while循环 对于while语句而言,如果不满足条件,则不能进入循环.但有时候我们需要即使不满足条件,也至少执行一次 do-while循环和while循环相似,不同的是,do-while循环至 ...
- uni-app跨平台框架介绍和快速入门
前言: 首先今天主要介绍的是一个多平台的前端框架uni-app,关于多平台的前端框架网上有很多成熟的解决方案比如说Taro,React Native,Flutter等这些都是一些非常优秀的前端跨平台的 ...
- redis的安装与设置开机自启动
redis 的安装配置: 可以直接去官网下载((https://redis.io/download) 解压文件到指定目录下 tar zxvf redis-5.0.7.tar.gz -C /opt/ ...
- 远程连接centos7中mysql8.0
远程连接centos7中mysql8.0 1.使用Navicat for MySQL或者其它数据连接软件 2.先检查centos中防火墙是否关闭,如果关闭不需要设置,如果没有关闭防火墙,请打开3306 ...
- BATJ经典软件测试面试题我连答案都告诉你了,如果你不想月薪上万,那你别看!
单项选择题:共20小题,每小题1 分,满分20分:请将答案填入题后括号中. 1. 在软件生命周期的哪一个阶段,软件缺陷修复费用最低(A) A.需求分析(编制产品说明书) B.设计 C.编码 ...
- FastAPI(38)- 模拟一个跨域场景
同源策略 https://www.cnblogs.com/poloyy/p/15345184.html CORS https://www.cnblogs.com/poloyy/p/15345871.h ...
- FastAPI(45)- JSONResponse
背景 创建 FastAPI 路径操作函数时,通常可以从中返回任何数据:字典.列表.Pydantic 模型.数据库模型等 默认情况下,FastAPI 会使用 jsonable_encoder 自动将该返 ...