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

巧妙建图:以行或列上的联通块作为点,每个泥格子作为边,求最小点覆盖就可以了!

于是用匈牙利算法找最大匹配。注意要对右部点记录每一个左部点的vis!

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int n=,N=((n*n)<<);
int r,c,head[N],xnt=,stack[n],top,cnt,col[n][n],pre[N],knt;
char ch[n][n];
bool vis[N];
struct Edge{
int next,to;
Edge(int n=,int t=,int c=):next(n),to(t) {}
}edge[N];
bool check(int cur)
{
for(int i=head[cur],v;i;i=edge[i].next)
if(!vis[v=edge[i].to])
{
vis[v]=;
if(!pre[v=edge[i].to]||check(pre[v]))
{pre[v]=cur;/*printf("cur=%d v=%d\n",cur,v);*/return true;}
}
return false;
}
void cz1(int i)
{
cnt++;
while(ch[i][stack[top]]=='*')col[i][stack[top--]]=cnt;
}
void cz2(int i)
{
cnt++;
while(ch[stack[top]][i]=='*')
{
edge[++xnt]=Edge(head[col[stack[top]][i]],cnt);
// printf("%d %d\n",col[stack[top]][i],cnt);
head[col[stack[top--]][i]]=xnt;
}
}
int main()
{
scanf("%d%d",&r,&c);
for(int i=;i<=r;i++)
{
getchar();
for(int j=;j<=c;j++)
{
scanf("%c",&ch[i][j]);
if(ch[i][j]=='*')stack[++top]=j;
else if(top)cz1(i);
}
if(top)cz1(i);
top=;
}
// for(int i=1;i<=r;i++)
// {
// for(int j=1;j<=c;j++)
// printf("%d",col[i][j]);printf("\n");
// }
int lm=cnt;
for(int i=;i<=c;i++)
{
for(int j=;j<=r;j++)
{
if(ch[j][i]=='*')stack[++top]=j;
else if(top)cz2(i);
}
if(top)cz2(i);
top=;
}
for(int i=;i<=lm;i++)
{
memset(vis,,sizeof vis);//万一同一次踩在同一个未匹配右部点的话
if(check(i))knt++; //右边不会主动匹配左边 ,这个i一定未匹配
}
printf("%d",knt);
return ;
}

POJ2226Muddy Fields的更多相关文章

  1. poj2226Muddy Fields——二分图匹配

    题目:http://poj.org/problem?id=2226 把行连通块作为左部点,列连通块作为右部点,行列连通块有相交的格子就连边: 则问题转化为求最小点覆盖,即最大匹配. 代码如下: #in ...

  2. poj2226-Muddy Fields二分匹配 最小顶点覆盖 好题

    题目 给到一个矩阵,有些格子上是草,有些是水.需要用宽度为1,长度任意的若干块木板覆盖所有的水,并不能覆盖草,木板可以交叉,但只能横竖放置,问最少要多少块板. 分析 经典的矩阵二分图构图和最小点覆盖. ...

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

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

  4. POJ 3254. Corn Fields 状态压缩DP (入门级)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9806   Accepted: 5185 Descr ...

  5. 【BZOJ1725】[Usaco2006 Nov]Corn Fields牧场的安排 状压DP

    [BZOJ1725][Usaco2006 Nov]Corn Fields牧场的安排 Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M< ...

  6. poj 3254 Corn Fields

    http://poj.org/problem?id=3254 Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissio ...

  7. Corn Fields——POJ3254状态压缩Dp

    Corn Fields Time Limit: 2000MS Memory Limit: 65536K Description Farmer John has purchased a lush new ...

  8. CLR via C# 3rd - 07 - Constants and Fields

    1. Constants        A constant is a symbol that has a never-changing value. When defining a constant ...

  9. (转)Image Segmentation with Tensorflow using CNNs and Conditional Random Fields

    Daniil's blog Machine Learning and Computer Vision artisan. About/ Blog/ Image Segmentation with Ten ...

随机推荐

  1. poj3071 Football(概率dp)

    poj3071 Football 题意:有2^n支球队比赛,每次和相邻的球队踢,两两淘汰,给定任意两支球队相互踢赢的概率,求最后哪只球队最可能夺冠. 我们可以十分显然(大雾)地列出转移方程(设$f[ ...

  2. JS中的slice和splice

    1,slice  : 定义:接收一个或两个参数,它可以创建一个由当前数组中的一项或多项组成的新数组,注意是新数组哦~ 也就是说它不会修改原来数组的值. 用法:slice( para1 ),会截取从pa ...

  3. python有木有哪些必须要学习的高级模块

    python有木有哪些必须要学习的高级模块 字母表

  4. BZOJ 1951 【SDOI2010】 古代猪文

    题目链接:古代猪文 好久没写博客了,这次就先写一篇吧…… 题面好鬼……概括起来就是:给出\(N,G(\leqslant 10^9)\),求:\[G^{\sum_{d|n}\binom{n}{d}} \ ...

  5. session与cookie详解

    session与cookie是什么? session与cookie属于一种会话控制技术.常用在身份识别,登录验证,数据传输等.举个例子,就像我们去超市买东西结账的时候,我们要拿出我们的会员卡才会获取优 ...

  6. CPU上下文切换详解

    CPU上下文切换详解 原文地址,译文地址,译者: 董明鑫,校对:郑旭东 上下文切换(有时也称做进程切换或任务切换)是指CPU 从一个进程或线程切换到另一个进程或线程.进程(有时候也称做任务)是指一个程 ...

  7. Java实现ping功能的三种方法及Linux的区分

    前大半部份转自:https://blog.csdn.net/futudeniaodan/article/details/52317650 检测设备的运行状态,有的是使用ping的方式来检测的.所以需要 ...

  8. Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理

    Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理 转自:https://www.jianshu.com/p/2b71ea919d49 本系列文章首发于我的个人博 ...

  9. 2-7-搭建DNS服务器实现域名解析

    学习服务的方法: 了解服务的作用:名称,功能,特点 安装服务 配置文件的位置,端口 服务开启和关闭的脚本 修改配置文件(实战举例) 排错(从上到下,从内到外) -------------------- ...

  10. const关键字对C++成员函数的修饰

    const对C++成员函数的修饰分为三种:1. 修饰参数:2. 修饰返回值:3. 修饰this指针.简述一下知识点如下,以后找功夫再完善. 1. 对函数参数的修饰. 1)const只能用来修饰输入参数 ...