题目大意:

在空地上放置尽可能多机器人,机器人朝上下左右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的更多相关文章

  1. ZOJ 1654 Place the Robots (二分匹配 )

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=654 Robert is a famous engineer. One ...

  2. ZOJ 1654 Place the Robots(放置机器人)------最大独立集

    Place the Robots http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1654 Time Limit: 5 Sec ...

  3. ZOJ 1654 Place the Robots建图思维(分块思想)+二分匹配

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=654 AC一百道水题,不如AC一道难题来的舒服. 题意:一个n*m地图 ...

  4. 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 ...

  5. ZOJ 1654 - Place the Robots (二分图最大匹配)

    题意:在一个m*n的地图上,有空地,草和墙,其中空地和草能穿透攻击光线,而墙不能.每个机器人能够上下左右攻击,问在地图上最多能放多少个不互相攻击的机器人. 这个题和HDU 1045 -  Fire N ...

  6. ZOJ 1654 二分匹配基础题

    题意: 给你一副图, 有草地(*),空地(o)和墙(#),空地上可以放机器人, 机器人向上下左右4个方向开枪(枪不能穿墙),问你在所有机器人都不相互攻击的情况下能放的最多的机器人数. 思路:这是一类经 ...

  7. ACM -二分图题目小结

    暂时只包括与最大匹配相关的问题. 求最大独立集,最小路径覆盖等等大多数题目都可以转化为求最大匹配用匈牙利算法解决. 1.最大匹配(边集) 此类问题最直接,直接用匈牙利算法即可. HDU 2063  过 ...

  8. ZOJ 1654--Place the Robots【二分匹配 &amp;&amp; 经典建图】

    Place the Robots Time Limit: 5 Seconds      Memory Limit: 32768 KB Robert is a famous engineer. One ...

  9. ZOJ题目分类

    ZOJ题目分类初学者题: 1001 1037 1048 1049 1051 1067 1115 1151 1201 1205 1216 1240 1241 1242 1251 1292 1331 13 ...

随机推荐

  1. bzoj 1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛【dp+树状数组+hash】

    最长上升子序列.虽然数据可以直接n方但是另写了个nlogn的 转移:f[i]=max(f[j]+1)(a[j]<a[i]) O(n^2) #include<iostream> #in ...

  2. [App Store Connect帮助]五、管理构建版本(1)上传构建版本概述

    在您添加 App 至您的帐户之后,您可以使用 Xcode 或 Application Loader 来上传构建版本.稍后,您可以随着您 App 的更改上传更多构建版本.分发构建版本以供测试,或提交您的 ...

  3. [Qt Creator 快速入门] 第3章 窗口部件

    从这一章开始正式接触Qt的窗口部件.在第2章曾看到 Qt Creator 提供的默认基类只有 QMainWindow.QWidget 和 QDialog 这3种.QMainWindow 是带有菜单栏和 ...

  4. (3)左右值再探与decltype

    Decltype 类型指示符 “引用从来都作为其所指对象的同义词出现,只有用在decltype处是一个例外” 理解: Decltype和auto区别: 1.     auto是从表达式类型推断出要定义 ...

  5. ImmutableJS

    引用大神的一句话:(具体是谁自己问度娘) Shared mutable state is the root of all evil(共享的可变状态是万恶之源) -- Pete Hunt   JavaS ...

  6. NodeJS、NPM安装配置步骤

    安装NodeJS和NPM 1.Node JS 官网下载地址 https://nodejs.org/en/download/ 2.安装完后,使用cmd 命令输入两个命令,查看安装状态 node -v n ...

  7. 全3D模具设计自动化解決方案

  8. vps 虚拟服务器 教程 ( Virtual Private Server 虚拟专用服务器 )

    VPS是虚拟服务器的意思.他是通过软件在独立服务器上划分出来的一部分资源.从而虚拟出一个服务器.他拥有独立的IP.独立的操作系统.以及用户名和密码.在功能和使用方法上与服务器一模一样.用户也可以根据自 ...

  9. linux使用crontab实现PHP执行计划定时任务

    linux使用crontab实现PHP执行计划定时任务 前几天写过一篇文章,利用单纯的php实现定时执行任务,但是效率不佳,对于linux来说用crontab实现更加合理 首先说说cron,它是一个l ...

  10. layui修改数据的时候下拉框和选择框默认选中

    // 获取需求类型function getType() { var typeHtml = ''; $.ajax({ url: pUrl + 'back_findTypeList.do', type: ...