zoj1654 Place the Robots 二分图最大匹配
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=654
将每一行的包含空地的区域编号
再将每一列的包含空地的区域编号
然后把每一个横向块看作二部图中顶点的集合x中的顶点
竖向块看作集合y中的顶点,若两个块有公共的空地,则将他们连边
然后就转化为二分图最大匹配问题
代码:
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
using namespace std; #define maxn 51
int xn,yn;
int x[maxn*maxn],y[maxn*maxn];
int xs[maxn][maxn],ys[maxn][maxn];
int m,n;
int g[maxn*maxn][maxn*maxn];
int vis[maxn*maxn];
char map[maxn][maxn];
int ans;
bool path(int u)
{ for(int v=;v<=yn;v++)
{
if(g[u][v] && vis[v]==)
{ vis[v]=;
if(y[v]== || path(y[v]))
{
x[u]=v;
y[v]=u;
return ;
}
}
}
return ;
}void MaxMatch()
{
ans=;
memset(x,,sizeof(x));
memset(y,,sizeof(y));
for(int i=;i<=xn;i++)
if(!x[i])
{
memset(vis,,sizeof(vis));
if(path(i))
ans++; }
printf("%d\n",ans);
}
int main()
{
int t;
scanf("%d",&t);
int iCase=;
while(t--)
{
printf("Case :%d\n",++iCase); scanf("%d%d",&m,&n);
memset(xs,,sizeof(xs));
memset(ys,,sizeof(ys)); for(int i=;i<m;i++)
scanf("%s",map[i]); int num=;
bool flag;
for(int i=;i<m;i++)//对水平方向的块进行编号
{
flag=;
for(int j=;j<n;j++)
{
if(map[i][j]=='o')
{
if(flag==) num++;
xs[i][j]=num; flag=;
}
else if(map[i][j]=='#') flag=;
}
}
xn=num;
num=; for(int j=;j<n;j++)//对垂直方向的块进行编号
{
flag=;
for(int i=;i<m;i++)
{
if(map[i][j]=='o')
{
if(flag==) num++;
ys[i][j]=num;flag=;
}
else if(map[i][j]=='#') flag=;
}
} yn=num; memset(g,,sizeof(g)); for(int i=;i<m;i++)
{
for(int j=;j<n;j++)
{
if(xs[i][j]) g[xs[i][j]][ys[i][j]]=;
}
}
MaxMatch(); }
return ;
}
zoj1654 Place the Robots 二分图最大匹配的更多相关文章
- ZOJ1654 Place the Robots(二分图最大匹配)
最大匹配也叫最大边独立集,就是无向图中能取出两两不相邻的边的最大集合. 二分图最大匹配可以用最大流来解. 如果题目没有墙,那就是一道经典的二分图最大匹配问题: 把地图上的行和列分别作为点的X部和Y部, ...
- POJ 2226二分图最大匹配
匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是二部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图 ...
- POJ2239 Selecting Courses(二分图最大匹配)
题目链接 N节课,每节课在一个星期中的某一节,求最多能选几节课 好吧,想了半天没想出来,最后看了题解是二分图最大匹配,好弱 建图: 每节课 与 时间有一条边 #include <iostream ...
- poj 2239 二分图最大匹配,基础题
1.poj 2239 Selecting Courses 二分图最大匹配问题 2.总结:看到一个题解,直接用三维数组做的,很巧妙,很暴力.. 题意:N种课,给出时间,每种课在星期几的第几节课上 ...
- UESTC 919 SOUND OF DESTINY --二分图最大匹配+匈牙利算法
二分图最大匹配的匈牙利算法模板题. 由题目易知,需求二分图的最大匹配数,采取匈牙利算法,并采用邻接表来存储边,用邻接矩阵会超时,因为邻接表复杂度O(nm),而邻接矩阵最坏情况下复杂度可达O(n^3). ...
- 二分图最大匹配的König定理及其证明
二分图最大匹配的K?nig定理及其证明 本文将是这一系列里最短的一篇,因为我只打算把K?nig定理证了,其它的废话一概没有. 以下五个问题我可能会在以后的文章里说,如果你现在很想知道的话,网上 ...
- POJ3057 Evacuation(二分图最大匹配)
人作X部:把门按时间拆点,作Y部:如果某人能在某个时间到达某门则连边.就是个二分图最大匹配. 时间可以二分枚举,或者直接从1枚举时间然后加新边在原来的基础上进行增广. 谨记:时间是个不可忽视的维度. ...
- HDU:过山车(二分图最大匹配)
http://acm.hdu.edu.cn/showproblem.php?pid=2063 题意:有m个男,n个女,和 k 条边,求有多少对男女可以搭配. 思路:裸的二分图最大匹配,匈牙利算法. 枚 ...
- UOJ #78 二分图最大匹配
#78. 二分图最大匹配 从前一个和谐的班级,有 nl 个是男生,有 nr 个是女生.编号分别为 1,…,nl 和 1,…,nr. 有若干个这样的条件:第 v 个男生和第 u 个女生愿意结为配偶. 请 ...
随机推荐
- shell脚本监控目录下文件被篡改时报警
思路: 目录下文件被篡改的几种可能: 1.被修改 2.被删除 3.新增文件 md5命令详解 参数: -b 以二进制模式读入文件内容 -t 以文本模式读入文件内容 -c 根据已生成的md5值,对现存文件 ...
- centos下编译phantomjs2.0
phantomjs是一个无头浏览器,可以用来做测试和爬虫,但是因为有一些问题没有解决,所以官网不提供2.0版本的binary包,所以要自己编译. 1.安装需要的依赖: sudo yum -y inst ...
- SPOJ - BITDIFF: Bit Difference [神妙の预处理]
tags:[数学][预处理]题解:我们用一种巧妙的预处理姿势:记录下每一个数位上分别出现了多少个1.如果第i个数位上出现了cnt[i]个1,那么,在这个数位上产生的"差异值"为:2 ...
- 持续集成:TestNG组织如何测试用例
持续集成:TestNG组织如何测试用例 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:90 ...
- 性能调优之Java系统级性能监控及优化
性能调优之Java系统级性能监控及优化 对于性能调优而言,通常我们需要经过以下三个步骤:1,性能监控:2,性能剖析:3,性能调优 性能调优:通过分析影响Application性能问题根源,进行优化 ...
- 优雅高效的MyBatis-Plus工具快速入门使用
目前正在维护的公司的一个项目是一个ssm架构的java项目,dao层的接口有大量数据库查询的方法,一个条件变化就要对应一个方法,再加上一些通用的curd方法,对应一张表的dao层方法有时候多达近20个 ...
- Redis基础学习(三)—Key操作
一.key的相关操作 1.删除 del key1 key2 ... Keyn 作用: 删除1个或多个键. 返回值: 不存在的key忽略掉,返回真正删除的key的数量. 2.重命名 rename k ...
- Andorid开发中如何去除标题栏title
有两种方法可以去除标题栏的title. 1.在代码中实现 在setContentView()方法之前加上这一句 requestWindowFeature(Window.FEATURE_NO_TITLE ...
- Mysql清理二进制日志的技巧
1:二进制日志 二进制日志记录了所有的DDL(数据定义语言)语句和DML(数据操作语言)语句,但是不记录包括数据查询的语句.语句以"事件"的形式保存,它描述了数据的更改过程,此日志 ...
- Executor以及线程池
在应用程序中,总是会出现大量的任务,包括相同类型的和不同类型的.要快速处理这些任务,常见方法就是利用多线程,但是也不可能为每个任务都创建一个线程,这样内存也不够,并且线程的创建销毁开销很大.最好是少量 ...