题意:给出一个图,其中有 . 和 X 两种,. 为通路,X表示墙,在其中放炸弹,然后炸弹不能穿过墙,问你最多在图中可以放多少个炸弹?

这个题建图有点复杂orz。

建图,首先把每一行中的可以放一个炸弹的一块区域标记为同一个数字,数字不重复,然后列做相同的处理,即缩点!

缩点之后原图矩阵中每个点都对用一个行数字和一个列数字,然后按照这两个数字进行二分匹配,其相同值只取一个,得到的结果就是ans。

 1 #include<iostream>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #define maxn 10
 6 using namespace std;
 7 int n;
 8 int cnt_row,cnt_col;
 9 char map[maxn][maxn];
10 int line[maxn][maxn],row[maxn][maxn],col[maxn][maxn],match[maxn],used[maxn];
11 int dfs(int x){
12     for (int i=0;i<cnt_col;i++){
13         if (line[x][i]==1 && !used[i]){
14             used[i]=1;
15             if (match[i]==-1 || dfs(match[i])){
16                 match[i]=x;
17                 return 1;
18             }
19         }
20     }
21     return 0;
22 }
23 int main(){
24     while (cin >> n && n){
25         for (int i=0;i<n;i++){
26             for (int j=0;j<n;j++){
27                 cin >> map[i][j];
28             }
29         }
30         memset(row,-1,sizeof(row));
31         memset(col,-1,sizeof(col));
32         cnt_row=0,cnt_col=0;
33         for (int i=0;i<n;i++){
34             for (int j=0;j<n;j++){
35                 if (map[i][j]=='.' && row[i][j]==-1){
36                     for (int k=j;map[i][k]=='.' && k<n;k++) row[i][k]=cnt_row;
37                     cnt_row++;
38                 }
39                 if (map[j][i]=='.' && col[j][i]==-1){
40                     for (int k=j;map[k][i]=='.' && k<n;k++) col[k][i]=cnt_col;
41                     cnt_col++;
42                 }
43             }
44         }
45         memset(line,0,sizeof(line));
46         for (int i=0;i<n;i++){
47             for (int j=0;j<n;j++){
48                 if (map[i][j]=='.' && row[i][j]!=-1 && col[i][j]!=-1)
49                     line[row[i][j]][col[i][j]]=1;
50             }
51         }
52         int ans=0;
53         memset(match,-1,sizeof(match));
54         for (int i=0;i<cnt_row;i++){
55                 memset(used,0,sizeof(used));
56                 if (dfs(i)) ans++;
57         }
58         cout << ans << endl;
59     }
60     return 0;
61 }

转载于:https://www.cnblogs.com/changer-qyz/p/8650321.html

hdoj1045 Fire Net(二分图最大匹配)相关推荐

  1. 解题报告 (九) 二分图最大匹配

    文章目录 二分图最大匹配 解题报告 一.最大匹配模板题 HDU 1083 Courses HDU 2063 过山车 HDU 1528 Card Game Cheater HDU 1179 Olliva ...

  2. 【网络流24题】解题报告:A、飞行员配对方案问题(最大流求二分图最大匹配)

    A.飞行员配对方案问题 (二分图最大匹配)(最大流)[提高+/省选- ] 题目链接 [问题分析] 二分图最大匹配问题. [建模方法] 在二分图的基础上增加源S和汇T. 1.S向X集合中每个顶点连一条容 ...

  3. 【模板】匈牙利算法 二分图最大匹配题模板

    [任务] 给定一个二分图,用匈牙利算法求这个二分图的最大匹配数. [说明] 求最大匹配,那么我们希望每一个在左边的点都尽量找到右边的一个点和它匹配. 我们一次枚举左边的点x的所有出边指向的点y, 若y ...

  4. 51nod 2006 飞行员配对(二分图最大匹配) 裸匈牙利算法 求二分图最大匹配题

    题目: 题目已经说了是最大二分匹配题, 查了一下最大二分匹配题有两种解法, 匈牙利算法和网络流. 看了一下觉得匈牙利算法更好理解, 然后我照着小红书模板打了一遍就过了. 匈牙利算法:先试着把没用过的左 ...

  5. 2021牛客多校3 - Minimum grid(二分图最大匹配-最大流)

    题目链接:点击查看 题目大意:给出一个 n∗nn*nn∗n 的棋盘,其中有 mmm 个位置是需要填数字的位置,每个位置需要填 [0,k][0,k][0,k] 的数字中的其中一个,可以重复,现在给出每一 ...

  6. HDU - 1054 Strategic Game(最小点覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:给出一棵树,现在要在节点上放置士兵,每个士兵可以监视与其所在的节点直接相连的节点,问最少需要多少个士兵才能将整棵树都监视到 题目分析:求最少的节点,以保证每条边都有一个端 ...

  7. HDU - 2389 Rain on your Parade(Hopcroft-Krap算法求二分图最大匹配)

    题目链接:点击查看 题目大意:给出n个人和m个雨伞,t分钟后就要下雨了,现在给出每个人的坐标和速度,以及雨伞所在的坐标,每个雨伞只能容纳一个人,题目问最多有多少个人能不被淋到 题目分析:二分图最大匹配 ...

  8. POJ - 2226 Muddy Fields(最小点覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:给出一个n*m的地图,地图中'*'代表泥地,'.'代表空地,现在我们有两种木板,一种可以覆盖一行中的任意长度,我们成为行木板,另一种可以覆盖一列中的任意长度,我们成为列木 ...

  9. HDU - 1528 Card Game Cheater(二分图最大匹配)

    题目链接:点击查看 题目大意:题意有点像求田忌赛马的最优解,大概意思就是现在有两个人,每个人都有n张不同的扑克牌,扑克牌的大小首先以点数来确定,点数相同的情况下以花色来决定,红桃(Heart)> ...

  10. HDU - 1150 Machine Schedule(最小点覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:现在有一个机器A和一个机器B,A机器有n种模式,B机器有m种模式,现在有k次工作需要完成,每次工作的信息为: id x y:编号为id,在A机器要用x模式完成,在B机器要 ...

最新文章

  1. python中append的用法_Python 列表 append() 使用方法及示例
  2. c语言计算日出日落时间_计算日出日落算法实现
  3. codevs 4560 NOIP2015 D2T2 子串
  4. 牛客网——华为机试(题15:求int型正整数在内存中存储时1的个数)(Java)
  5. oracle数据库11gr2,Oracle 11g R2 X64数据库安装
  6. mysql远程压力测试_mysql压力测试脚本实例
  7. 在ubuntu中安装minicom时出现device /dev/tty8 is locked解决办法
  8. 相邻位数字差值的绝对值不能超过_热点争议中技术问题,伺服控制有几个零点?对应真绝对值多圈编码器意义...
  9. 【DotNet加密方式解析】-- 好文收藏
  10. Oracle 屠刀下的 Java 软件公司怎么活?
  11. python复数运算程序_python复数-python,复数
  12. oracle12c新特点之可插拔数据库(Pluggable Database,PDB)
  13. 实验四 数组程序设计
  14. C++ 把引用作为函数参数
  15. 怎么获取echarts需要的geoJson数据去渲染地图:以广州市白云区24镇街为例(内附资源)
  16. 小程序 - canvas绘制海报
  17. IP地址、网络地址、网关的作用
  18. openwrt在mt7620a上的折腾笔记
  19. 量子计算机为什么低温,突破量子计算机瓶颈!超低温芯片能在接近绝对零度的温度下工作...
  20. 主引导记录(MBR)

热门文章

  1. mysql强制禁止使用索引_MYSQL强制使用索引和禁止使用索引
  2. 注释标记的原则_它关系到平台如何标记操纵的媒体。 这是设计师应遵循的12条原则。
  3. (送书和红包)快人一步,掌握前端函数式编程
  4. go 中gcc 编译问题(gcc.exe fatal error no input files compilation terminated)
  5. postgres的数据库备份和恢复
  6. Java枚举根据key获取value
  7. activemq 安全连接
  8. 使用keepalived实现双机热备
  9. gtk+学习笔记(五)
  10. easyui datagrid plunges 扩展 插件