POJ 2226 Muddy Fields(最小点覆盖)题解
题意:一片r*c的地,有些地方是泥地,需要铺地板。这些地板宽1,长无限,但只能铺在泥地上不能压到其他地方,问你铺满所有泥地最少几块
思路:我们把一行中连续的泥地看成整体,并把所有横的整体里的点编成一个id号,同样把竖的所有整体编号,这样一个点就有横竖两个编号,那么我给这两个编号连边,那么只要涂这个边就代表了这个点被模板盖住了,那么问题就转化为了最小点覆盖
代码:
- #include<set>
- #include<map>
- #include<stack>
- #include<cmath>
- #include<queue>
- #include<vector>
- #include<string>
- #include<cstdio>
- #include<cstring>
- #include<sstream>
- #include<iostream>
- #include<algorithm>
- typedef long long ll;
- using namespace std;
- const int maxn = + ;
- const int MOD = 1e9 + ;
- const int INF = 0x3f3f3f3f;
- int linker[maxn];
- bool used[maxn];
- struct node{
- int row, col;
- }p[maxn][maxn];
- int n;
- int head[maxn], tot;
- struct Edge{
- int to, next;
- }edge[maxn * maxn];
- char mp[maxn][maxn];
- void init(){
- memset(head, -, sizeof(head));
- tot = ;
- }
- void addEdge(int u, int v){
- edge[tot].to = v;
- edge[tot].next = head[u];
- head[u] = tot++;
- }
- bool dfs(int u){
- for(int i = head[u]; i != -; i = edge[i].next){
- int v = edge[i].to;
- if(!used[v]){
- used[v] = true;
- if(linker[v] == - || dfs(linker[v])){
- linker[v] = u;
- return true;
- }
- }
- }
- return false;
- }
- int hungry(){
- int res = ;
- memset(linker, -, sizeof(linker));
- for(int u = ; u <= n; u++){
- memset(used, false, sizeof(used));
- if(dfs(u)) res++;
- }
- return res;
- }
- int main(){
- int r, c;
- while(~scanf("%d%d", &r, &c)){
- n = ;
- init();
- for(int i = ; i <= r; i++){
- scanf("%s", mp[i] + );
- for(int j = ; j <= c; j++){
- p[i][j].col = p[i][j].row = ;
- }
- }
- for(int i = ; i <= r; i++){
- for(int j = ; j <= c; j++){
- if(mp[i][j] == '*'){
- if(j > && mp[i][j - ] == '*'){
- p[i][j].row = p[i][j - ].row;
- }
- else{
- p[i][j].row = ++n;
- }
- }
- }
- }
- for(int i = ; i <= r; i++){
- for(int j = ; j <= c; j++){
- if(mp[i][j] == '*'){
- if(i > && mp[i - ][j] == '*'){
- p[i][j].col = p[i - ][j].col;
- }
- else{
- p[i][j].col = ++n;
- }
- addEdge(p[i][j].row, p[i][j].col);
- }
- }
- }
- printf("%d\n", hungry());
- }
- return ;
- }
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(最小点覆盖)
题意: M*N的矩阵,每个格不是*就是#. *代表水坑,#代表草地. 农民要每次可以用一块宽为1,长不限的木板去铺这个矩阵.要求这块木板不能覆盖草地.木板可以重复覆盖(即一块木板与另一块木板有 ...
- POJ 2226 Muddy Fields (二分图匹配)
[题目链接] http://poj.org/problem?id=2226 [题目大意] 给出一张图,上面有泥和草地,有泥的地方需要用1*k的木板覆盖, 有草地的地方不希望被覆盖,问在此条件下需要的最 ...
随机推荐
- org.joda.time.DateTime 日期格式
最近一直在使用Java,偶尔一次遇到日期(util)的格式转换,心里还是规矩的写着记忆里面的代码,但是在自己测试的时候发现不正确,具体看了下代码,发现这里使用jota的方式编写,顺道查了一下,做了笔记 ...
- Oracle / PLSQL函数 - DECODE
1.DECODE( expression , search , result [, search , result]... [, default] ) 参数说明: expression : 表中的某一 ...
- DX9 顶点缓存案例
// @time 2012.3.5 // @author jadeshu //包含头文件 #include <Windows.h> #include <d3d9.h> #pra ...
- kail linux arp欺骗
首先连接wifi,进入内网 1,查看内网的存活主机 命令 fping -asg 192.168.1.0/24 (视不同环境而定,假设这里的路由器地址为 192.168.1.1) 也可利用其他 ...
- Marlin 擠出頭溫度控制PID值校正
Marlin 擠出頭溫度控制PID值校正 擠出頭加熱器.溫度感應器安裝好後,先別急著直接指定工作溫度並且加熱.因為控制板上的溫度控制PID參數尚未校正.如果加熱速度過快,有可能會加熱過度並且導致零件燒 ...
- Tornado安装
Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快.得利于其 非阻塞的方式和对 epoll 的运用,Tornado ...
- 转:wcf大文件传输解决之道(2)
此篇文章主要是基于http协议应用于大文件传输中的应用,现在我们先解析下wcf中编码器的定义,编码器实现了类的编码,并负责将Message内存中消息转变为网络发送的字节流或者字节缓冲区(对于发送方而言 ...
- django 集合
1,前言 socket 位于应用层和传输层之间的一个抽象层,它是一个接口. 百度的服务器(socket服务端) . 启动socket . 绑定ip和端口 . 监听 . 接收数据 . 发送数据 . 断开 ...
- var_dump()函数输出不完整,有省略号?解决办法
php开发环境里,安装了xdebug模块后,var_dump()输出的结果将比较易于查看,但默认情况下,var_dump() 输出的结果将有所变化:过多的数组元素不再显示,字符串变量将只显示前N个字符 ...
- CentOS6.4下邮件服务器搭建
CentOS6.4下邮件服务器搭建 linux下邮件服务器的搭建大致分为三个步骤 准备工作(真实的生产环境下需要) 发送服务器安装及配置 (Postfix) 接收服务器安装及配置(dovecot) ...