ZOJ 1654 Place the Robots
题目大意:
在空地上放置尽可能多机器人,机器人朝上下左右4个方向发射子弹,子弹能穿过草地,但不能穿过墙,
两个机器人之间的子弹要保证互不干扰,求所能放置的机器人的最大个数
每个机器人所在的位置确定了,那么对应的横向和竖向子弹能到达的空地就全部被覆盖了
我们将横向所能连接在一块的空地区域标上同一个标号
比如o*o#o , 就可标号为10102因为1,3空地中间的草地不影响子弹的穿越
同理,我们将竖向的所能连接在一块的空地区域标上同一个标号
那么就可以建立一个横向到达竖向的二部图匹配
每次成功匹配一对,就相当于在这横竖交叉处放了一个炮台
这就转化成了最大匹配数
#include <cstdio>
#include <cstring> using namespace std;
const int N = ; char str[N][N];
int n , m , xs[N][N] , ys[N][N] , idx , idy;//idx记录以行为轴的最大标号,idy则表示以列为轴的最大标号
int cx[N*N] , cy[N*N] , visy[N*N];
bool g[N*N][N*N];//int是4个字节,用int会MLE,bool一个字节 int dfs(int u)
{
for(int v = ; v<=idy ; v++){
if(g[u][v] && !visy[v]){
visy[v] = ;
if(cy[v] == - || dfs(cy[v])){
cx[u] = v;
cy[v] = u;
return ;
}
}
}
return ;
} int MaxMatch()
{
memset(cx , - , sizeof(cx));
memset(cy , - , sizeof(cy));
int ans = ;
for(int i= ; i<=idx ; i++){
if(cx[i] == -){
memset(visy , , sizeof(visy));
ans += dfs(i);
}
}
return ans;
} int main()
{
// freopen("a.in" , "r" , stdin);
int T , cas = ;
scanf("%d" , &T);
while(T--)
{
scanf("%d%d" , &n , &m);
for(int i = ; i<n ; i++)
scanf("%s" , str[i]); //给每行炮台所能触及的位置编为相同号
int id = , flag = ;
for(int i= ; i<n ; i++){
if(flag) flag = , id++;
for(int j = ; j < m ; j++){
if(str[i][j] == 'o')
xs[i][j] = id , idx = id , flag = ;
else if(str[i][j] == '#')
flag = , id++;
}
} //给每列炮台所能触及的位置编为相同号
id = , flag = ;
for(int i= ; i<m ; i++){
if(flag) flag = , id++;
for(int j = ; j < n ; j++){
if(str[j][i] == 'o')
ys[j][i] = id , idy = id , flag = ;
else if(str[j][i] == '#')
flag = , id++;
}
} //构造二部图
memset(g , , sizeof(g));
for(int i = ; i<n ; i++)
for(int j = ; j<m ; j++){
if(str[i][j] == 'o')
g[xs[i][j]][ys[i][j]] = true;
}
printf("Case :%d\n%d\n" , ++cas , MaxMatch());
}
return ;
}
ZOJ 1654 Place the Robots的更多相关文章
- ZOJ 1654 Place the Robots (二分匹配 )
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=654 Robert is a famous engineer. One ...
- ZOJ 1654 Place the Robots(放置机器人)------最大独立集
Place the Robots http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1654 Time Limit: 5 Sec ...
- ZOJ 1654 Place the Robots建图思维(分块思想)+二分匹配
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=654 AC一百道水题,不如AC一道难题来的舒服. 题意:一个n*m地图 ...
- ZOJ 1654 Place the Robots(最大匹配)
Robert is a famous engineer. One day he was given a task by his boss. The background of the task was ...
- ZOJ 1654 - Place the Robots (二分图最大匹配)
题意:在一个m*n的地图上,有空地,草和墙,其中空地和草能穿透攻击光线,而墙不能.每个机器人能够上下左右攻击,问在地图上最多能放多少个不互相攻击的机器人. 这个题和HDU 1045 - Fire N ...
- ZOJ 1654 二分匹配基础题
题意: 给你一副图, 有草地(*),空地(o)和墙(#),空地上可以放机器人, 机器人向上下左右4个方向开枪(枪不能穿墙),问你在所有机器人都不相互攻击的情况下能放的最多的机器人数. 思路:这是一类经 ...
- ACM -二分图题目小结
暂时只包括与最大匹配相关的问题. 求最大独立集,最小路径覆盖等等大多数题目都可以转化为求最大匹配用匈牙利算法解决. 1.最大匹配(边集) 此类问题最直接,直接用匈牙利算法即可. HDU 2063 过 ...
- ZOJ 1654--Place the Robots【二分匹配 && 经典建图】
Place the Robots Time Limit: 5 Seconds Memory Limit: 32768 KB Robert is a famous engineer. One ...
- ZOJ题目分类
ZOJ题目分类初学者题: 1001 1037 1048 1049 1051 1067 1115 1151 1201 1205 1216 1240 1241 1242 1251 1292 1331 13 ...
随机推荐
- Moco模拟服务器post&get请求 (二)
1.moco启动命令如下:java -jar moco-runner-0.12.0-standalone.jar 协议类型 -p 端口号 -c json配置文件 2.带参数的get请求 [ { &qu ...
- Font Awesome矢量图标
下载 font-awesome 文件夹到您的项目中. 在HTML的 <head> 中引用font-awesome.min.css. 可以将Font Awesome图标使用在几乎任何地方,只 ...
- srand()
//第一次:5 0 第二次:5 16 srand(); //seed为常数,则每次运行产生的随机数一样 printf(); //产生的随机数都是一样的,都是5 srand(time(NULL)); p ...
- [转]C语言文件操作函数大全(超详细)
fopen(打开文件)相关函数 open,fclose表头文件 #include<stdio.h>定义函数 FILE * fopen(const char * path,const cha ...
- 全面学习ORACLE Scheduler特性(11)使用Job Classes
六.使用Job Classes Job Classes 相当于创建了一个job组,DBA可以将那些具有相同特性的job,统统放到相同的Job Classes中,然后通过对Job Class应用ORAC ...
- 300 Longest Increasing Subsequence 最长上升子序列
给出一个无序的整形数组,找到最长上升子序列的长度.例如,给出 [10, 9, 2, 5, 3, 7, 101, 18],最长的上升子序列是 [2, 3, 7, 101],因此它的长度是4.因为可能会有 ...
- 编写UI自动化测试用例原则
1.一个脚本是一个完整的场景,从用户登陆操作到用户退出系统关闭浏览器.2.一个脚本脚本只验证一个功能点,不要试图用户登陆系统后把所有的功能都进行验证再退出系统3.尽量只做功能中正向逻辑的验证,不要考虑 ...
- Centos 开机自动联网
默认情况下,Centos不是自动连接上网的,要点击右上角有个电脑图标,选择system eth0进行连接, 可以修改开机启动配置只需修改:/etc/sysconfig/network-scripts/ ...
- Django--1、MTV及基本应用
web框架 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,以避免重复造轮子. 所有的Web应用,本质上是一个socket服务 ...
- 扩展Snackbar 使其支持居中显示
https://github.com/nispok/snackbar 默认Snackbar支持底部或者顶部显示,不支持居中显示 查看Snackbar.java的源码可以看到createMarginLa ...