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

思路:这是一类经典题的衍化,如果没有墙,我们会将行和列看成两列点阵,然后就可以用二分匹配解。

现在有墙怎么办呢, 把某一行或列(有墙的拆分成多个区域,可以看成多个行或列), 拆好以后更没有墙的做法一样了。

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = 1505;
vector <int> edge[maxn]; //记录以左排点为起点的单向边
int pre[maxn]; //右点阵的大小
bool vis[maxn]; //右点阵的大小
int n, m;
bool dfs(int u) {int i, v;for(i = 0; i < (int)edge[u].size(); i++) {v = edge[u][i];if(vis[v])continue;vis[v] = 1;if(pre[v] == -1 || dfs(pre[v])) {pre[v] = u;return 1;}}return 0;
}
char mp[51][51];
int num[51][51];int nx, ny, x[maxn][maxn], y[maxn][maxn];
int main() {int i, j, cas, ca = 1;scanf("%d", &cas);while(cas--) {scanf("%d%d", &n, &m);for(i = 0; i < n; i++)scanf("%s", mp[i]);memset(x, -1, sizeof(x));nx = 0;for(i = 0; i < n; i++) {for(j = 0; j < m; j++)if(mp[i][j] == 'o') x[i][j]= nx;else if(mp[i][j] == '#') nx++;nx++;}memset(y, -1, sizeof(y));ny = 0;for(j = 0; j < m; j++) {for(i = 0; i < n; i++)if(mp[i][j] == 'o') y[i][j] = ny;else if(mp[i][j] == '#') ny++;ny++;}for(i = 0; i < nx; i++) edge[i].clear();for(i = 0; i < n; i++)for(j = 0; j < m; j++)if(mp[i][j] == 'o')edge[x[i][j]].push_back(y[i][j]);memset(pre, -1, sizeof(int)*ny);//建边int cnt = 0;for(i = 0; i < nx; i++) {memset(vis, 0, sizeof(int)*ny);if(dfs(i)) cnt++;}printf("Case :%d\n%d\n", ca++, cnt);}return 0;
}

转载于:https://www.cnblogs.com/pangblog/p/3304047.html

ZOJ 1654 二分匹配基础题相关推荐

  1. UVALive 6525 Attacking rooks 二分匹配 经典题

    题目链接:点击打开链接 题意: 给定n*n的棋盘, 能够在'.'上摆 象棋中的车(X是墙壁) 使得随意两个车都不能互相攻击到 问:最多能摆多少个车. 思路: 二分匹配 1.若没有X.那么做法就是 X点 ...

  2. ZOJ-1654 Place the Robots 拆行拆列构图+二分匹配 Or 最大独立点集+TLE

    题意:给定一个方格,格子中的每点由空地,草地和墙组成,每个空地可以放置一个机器人,每个机器人能够向四个方向扫射激光,所以要给定一种方案能够在棋盘上放置足够多的机器人.激光可以穿过草地但是不能够穿过墙. ...

  3. 【网络流24题】 No.3 最小路径覆盖问题 (网络流|匈牙利算法 -最大二分匹配)...

    [题意] 给定有向图 G=(V,E).设 P 是 G 的一个简单路(顶点不相交) 的集合.如果 V 中每个 顶点恰好在 P 的一条路上,则称 P 是 G 的一个路径覆盖. P 中路径可以从 V 的任何 ...

  4. ZOJ 3988 2017CCPC秦皇岛 H:Prime Set(二分匹配)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3988 题意: 给你n个数,如果{i, j}满足i!=j & ...

  5. python代码基础题-python第一部分基础题1-80题

    各位Python的第一部分1-80道基础题已经整理好了,希望面试的时候能用的上. 1.为什么学习Python? Python是目前市面上,我个人认为是最简洁.最优雅.最有前途.最全能的编程语言,没有之 ...

  6. python代码基础题-python每日经典算法题5(基础题)+1(中难题)

    现在,越来越多的公司面试以及考验面试对算法要求都提高了一个层次,从现在,我讲每日抽出时间进行5+1算法题讲解,5是指基础题,1是指1道中等偏难.希望能够让大家熟练掌握python的语法结构已经一些高级 ...

  7. python每日经典算法题5(基础题)+1(中难题)

    现在,越来越多的公司面试以及考验面试对算法要求都提高了一个层次,从现在,我讲每日抽出时间进行5+1算法题讲解,5是指基础题,1是指1道中等偏难.希望能够让大家熟练掌握python的语法结构已经一些高级 ...

  8. 二分匹配大总结——Bipartite Graph Matchings[LnJJF]

    文章目录 二分匹配--Bipartite Graph Matchings[LnJJF] 认识:什么是二分图? 理解:现实模型如何与二分图相互转化? 如何判断能否转化? 能够转化的话,如何转化? 应用: ...

  9. 利用匈牙利算法Hopcroft-Karp算法解决二分图中的最大二分匹配问题 例poj 1469 COURSES...

    首先介绍一下题意:已知,有N个学生和P门课程,每个学生可以选0门,1门或者多门课程,要求在N个学生中选出P个学生使得这P个学生与P门课程一一对应. 这个问题既可以利用最大流算法解决也可以用匈牙利算法解 ...

  10. hdu 5093 二分匹配

    /* 题意:给你一些冰岛.公共海域和浮冰,冰岛可以隔开两个公共海域,浮冰无影响 求选尽可能多的选一些公共海域点每行每列仅能选一个. 限制条件:冰山可以隔开这个限制条件.即*#*可以选两个 预处理: * ...

最新文章

  1. AI快速入门学习的经验积累-最佳学习路线图谱梳理
  2. PHP 计算两个两个文件的相对路径
  3. 用WebService实现调用新浪的天气预报功能
  4. Jade/Pug模板引擎
  5. XSS-Game level 13
  6. 晚安,2017。你好,2018。
  7. Ubuntu下PostgreSQL数据库集群(PL/Proxy)配置方法
  8. 2021 年百度之星·程序设计大赛 - 初赛一
  9. c语言追踪机械腿位置,类人足球机器人动作规划与自适应轨迹跟踪算法研究.pdf...
  10. XP系统优化超简单实用版
  11. 3D打印社团的建立和一年的经营
  12. 成也史玉柱,败也史玉柱
  13. 360企业安全刘浩:避免创可贴式安全,企业云安全从顶层设计开始
  14. fpga 级联fifo(VHDL)
  15. L48.linux命令每日一练 -- 第七章 Linux用户管理及用户信息查询命令 -- last、lastb和lastlog
  16. 本机修改虚拟机linux中的代码文件
  17. 7-4 求幂级数展开的部分和(20 分)
  18. /var/spool/postfix/maildrop占用空间大量处理
  19. 智联招聘python岗位_python智联招聘爬虫
  20. luffcc项目-08-课程详情页、CKEditor富文本编辑器、课程详情页面、后台接口

热门文章

  1. html5豌豆上的公主,豌豆上的公主阅读练习及答案
  2. Content-type是application/json的作用
  3. 使用 urllib 构造请求对象
  4. shell截取字符串的方法
  5. day03_01 Python历史、32bit和64bit系统的区别
  6. javascript学习5
  7. VS“当前上下文中不存在名称“ViewBag”,当前上下文不存在名称“model””-已解决...
  8. nested exception is java.io.FileNotFoundException: class path resource [spring/spring-datasource-mog
  9. C# 处理应用程序减少内存占用
  10. html上传图片(进度条变化)、音乐