4554: [Tjoi2016&Heoi2016]游戏 二分图匹配
题目链接:
http://www.lydsy.com/JudgeOnline/problem.php?id=4554
题解:
如果没有硬石头的话,就是’*‘点对应的行列建边,然后跑最大匹配
硬石头什么作用?它可以让同一行或同一列存在不只一个炸弹,因此我们可以将一个硬石头的上下拆成两列,左右拆成两行,然后就可以用经典的做法来跑最大匹配了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std; const int maxn = ;
const int maxs = ;
int n, m; char str[maxn][maxn];
int _x[maxn][maxn], _y[maxn][maxn];
int _r, _c;
vector<int> G[maxs]; int lef[maxs], _t[maxs];
bool match(int u) {
for (int j = ; j < G[u].size(); j++) {
int v = G[u][j];
if (!_t[v]) {
_t[v] = ;
if (lef[v]==- || match(lef[v])) {
lef[v] = u;
return true;
}
}
}
return false;
} int BM() {
memset(lef, -, sizeof(lef));
for (int i = ; i < _r; i++) {
memset(_t, , sizeof(_t));
match(i);
}
int ret = ;
for (int i = ; i < _c; i++) {
if (lef[i] != -) ret++;
}
return ret;
} void init() {
for (int i = ; i < maxs; i++) G[i].clear();
} int main() {
while (scanf("%d%d", &n, &m) == && n) {
init();
for (int i = ; i < n; i++) scanf("%s", str[i]);
_r = , _c = ;
for (int i = ; i < n; i++) {
for (int j = ; j < m; j++) {
if (str[i][j] == '#') _r++;
else if (str[i][j] == '*') _x[i][j] = _r;
}
_r++;
}
for (int j = ; j < m; j++) {
for (int i = ; i < n; i++) {
if (str[i][j] == '#') _c++;
else if (str[i][j] == '*') _y[i][j] = _c;
}
_c++;
}
for (int i = ; i < n; i++) {
for (int j = ; j < m; j++) {
if (str[i][j] == '*') {
G[_x[i][j]].push_back(_y[i][j]);
}
}
}
printf("%d\n", BM());
}
return ;
} /*
4 4
#***
*#**
**#*
xxx#
*/
4554: [Tjoi2016&Heoi2016]游戏 二分图匹配的更多相关文章
- BZOJ 4554: [Tjoi2016&Heoi2016]游戏 二分图匹配
4554: [Tjoi2016&Heoi2016]游戏 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4554 Descripti ...
- bzoj4554: [Tjoi2016&Heoi2016]游戏 二分图匹配
4554: [Tjoi2016&Heoi2016]游戏 Description 在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂.简单的说,这个游戏就是在一张地图上放上若干个炸弹,看 是否能 ...
- BZOJ 4554 [Tjoi2016&Heoi2016]游戏 ——二分图
出原题,直接二分图匹配即可. #include <cstdio> #include <vector> #include <cstring> using namesp ...
- 【BZOJ4554】[Tjoi2016&Heoi2016]游戏 二分图最大匹配
[BZOJ4554][Tjoi2016&Heoi2016]游戏 Description 在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂.简单的说,这个游戏就是在一张地图上放上若干个炸弹,看 ...
- BZOJ 4554: [Tjoi2016&Heoi2016]游戏
Time Limit: 20 Sec Memory Limit: 128 MB Submit: 951 Solved: 572 [Submit][Status][Discuss] Descriptio ...
- bzoj4554: [Tjoi2016&Heoi2016]游戏(二分图匹配)
4554: [Tjoi2016&Heoi2016]游戏 题目:传送门 题解: 一道很牛逼的匈牙利..和之前模拟赛的一道题有点相似(不过这题不用完美匹配) 我们可以把连续的行和列全部编号(如果之 ...
- [BZOJ4554][TJOI2016&&HEOI2016]游戏(匈牙利)
4554: [Tjoi2016&Heoi2016]游戏 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 857 Solved: 506[Sub ...
- BZOJ_4554_[Tjoi2016&Heoi2016]游戏_二分图匹配
BZOJ_4554_[Tjoi2016&Heoi2016]游戏_二分图匹配 Description 在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂.简单的说,这个游戏就是在一张地图上放上若 ...
- BZOJ4554 - [TJOI2016&HEOI2016]游戏
原题链接 Description 给出一个的地图,地图上有空地.软石头和硬石头.求在这张地图上最多能放上多少个炸弹能使得任意两个炸弹之间不会互相炸到.炸弹能炸到的范围是该炸弹所在的一行和一列,炸弹的威 ...
随机推荐
- Linux下发包处理
Linux下发包处理: 1.用top分析工具来查看哪个进程占用的CPU资源比较大 2. 通过命令来查看都是那些端口被占用了 netstat -antp | more 3.在top里面查看到的异 ...
- 转载:T-SQL语句大全
一.基础 1.创建数据库 CREATE DATABASE database-name 2.删除数据库 drop database dbname 3.备份数据库 --- 创建 备份数据的 device ...
- [leetcode]_Unique Paths
题目:有一个m * n 的方格,如下图,一个小robot希望从左上角走到右下角,共有多少种不同的路线走法. 思路: 我的错误思路:全排列,从(0,0)走到(m - 1,n - 1)共需要往下走m-1步 ...
- yii2解析非x-www-form-urlencoded类型的请求数据(json,xml)
组件配置添加: 'request' => [ 'parsers' => [ 'application/json' => 'yii\web\JsonParser', 'applicat ...
- PHP,Mysql-根据一个给定经纬度的点,进行附近地点查询–合理利用算法,效率提高2125倍
目前的工作是需要对用户的一些数据进行分析,每个用户都有若干条记录,每条记录中有用户的一个位置,是用经度和纬度表示的.还有一个给定的数据库,存储的是一些已知地点以及他们的经纬度,内有43W多条的数据.现 ...
- phpcms v9 源码解析-1 index.php
这个是phpcms V9 的入口文件index.php. V9程序的执行绝大多数是从这个文件开始的,但不绝对,在项目下面的api.php和plugin.php是另外的入口文件,这里我们先不做深究. 在 ...
- 亚信联创--java面试题目总结
这几天投简历,只有两家的HR表示感兴趣.易思卓越和亚信联创,不管怎样如果能有机会面试都一定尽力表现,所以找了找网上的面经,这里先把题目总结一下. 职位要求如下: ------------------- ...
- Mac上添加adb_usb.ini
max上添加android驱动支持 用到的命令: 命令方式最简单,键入如下两行命令你就可以实现对文件的现实和隐藏功能了.这个时候肯定会有童鞋问:“在哪里敲命令呢?”,Launchpad——其他——终端 ...
- 【代码】ini 文件读取工具类
using System; using System.Runtime.InteropServices; using System.Text; namespace hrattendance.Common ...
- DrawTool画笔之图形笔
相关知识参考DrawTool画笔之纹理笔 , 图形笔的实现跟纹理笔的实现是一样的,重载Stroke的DrawCore方法,效果图: --------------------------------- ...