游戏 (匈牙利)

description

在 2016 年,佳媛姐姐喜欢上了一款游戏,叫做泡泡堂。

简单的说,这个游戏就是在一张地图上放上若干个炸弹,看是否能炸到对手,或者躲开对手的炸弹。在玩游戏的过程中,小 H 想到了这样一个问题:当给定一张地图,在这张地图上最多能放上多少个炸弹能使得任意两个炸弹之间不会互相炸到。炸弹能炸到的范围是该炸弹所在的一行和一列,炸弹的威力可以穿透软石头,但是不能穿透硬石头。

给定一张 n×m的网格地图:其中 * 代表空地,炸弹的威力可以穿透,可以在空地上放置一枚炸弹。 x 代表软石头,炸弹的威力可以穿透,不能在此放置炸弹。# 代表硬石头,炸弹的威力是不能穿透的,不能在此放置炸弹。例如:给出 1×4 的网格地图 *xx*,这个地图上最多只能放置一个炸弹。给出另一个1×4的网格地图 *x#*,这个地图最多能放置两个炸弹。

现在小 H 任意给出一张 n×m的网格地图,问你最多能放置多少炸弹。

输入格式

第一行输入两个正整数 n,m,n 表示地图的行数,m表示地图的列数。
接下来输入 n行 m 列个字符,代表网格地图。*的个数不超过 n×m个

输出格式

输出一个整数 a,表示最多能放置炸弹的个数

样例
Input
4 4
#***
*#**
**#*
xxx#
Output
5
数据范围与提示
1≤n,m≤50

solution

先不考虑石头而言,就普通的行列摆放的话
显然将行划分为一个集合,列划分为一个集合
天然做到了行行,列列不交叉
匈牙利跑二分图最大匹配即可

现在加上软石头,威力可以穿过
行列的限制没有发生改变,只是软石头处放不了炸弹

再考虑最特殊的硬石头,相当于分裂了棋盘的某行和某列
此时可以出现同行同列有炸弹,被硬石头分隔开的情况
那么不如直接加一个硬石头的限制,强制重新编号行和列(增加行列数量)
再跑匈牙利最大匹配

code

#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
#define maxn 55
vector < int > G[maxn * maxn];
int n, m;
char chess[maxn][maxn];
int row[maxn][maxn], col[maxn][maxn]; 
bool vis[maxn * maxn];
int match[maxn * maxn];bool find( int u ) {	for( int i = 0;i < G[u].size();i ++ ) {int v = G[u][i];if( vis[v] ) continue;vis[v] = 1;if( ! match[v] || find( match[v] ) ) {match[v] = u;return 1;}}return 0;
}int main() {scanf( "%d %d", &n, &m );for( int i = 1;i <= n;i ++ )scanf( "%s", chess[i] + 1 );int num = 0;for( int i = 1;i <= n;i ++ )for( int j = 1;j <= m;j ++ ) {if( chess[i][j] == '#' ) continue;if( j == 1 || chess[i][j - 1] == '#' ) num ++;row[i][j] = num;}for( int j = 1;j <= m;j ++ )for( int i = 1;i <= n;i ++ ) {if( chess[i][j] == '#' ) continue;if( i == 1 || chess[i - 1][j] == '#' ) num ++;col[i][j] = num;}for( int i = 1;i <= n;i ++ )for( int j = 1;j <= m;j ++ )if( chess[i][j] == '*' )G[row[i][j]].push_back( col[i][j] );int ans = 0;for( int i = 1;i <= num;i ++ ) {memset( vis, 0, sizeof( vis ) );if( find( i ) ) ans ++;}printf( "%d\n", ans );return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317672.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

D - Delete Prime Gym - 102875D

D - Delete Prime Gym - 102875D 题意&#xff1a; 长度为n的序列&#xff0c;每次从中取出编号为1或质数的数&#xff0c;组成新的序列d 现在给一个k&#xff0c;问序列中哪一位的值是k以及序列中第k位是多少 共T个询问 T< 2 * 105 n&#xff0c;k< 105 题解&#…

CF1628A-Meximum Array【二分】

正题 题目链接:http://codeforces.com/contest/1628/problem/A 题目大意 给出一个长度为nnn的序列aaa和一个空序列bbb&#xff0c;你每次可以选择aaa的一个前缀&#xff0c;将它的mexmexmex加入序列bbb的末尾&#xff0c;然后将aaa的这个前缀删除。 求bbb的最大字典序。 1≤…

gym 102875 H. Happy Morse Code

gym 102875 H. Happy Morse Code 题意&#xff1a; 一个长度为n的字符串&#xff0c;现在给你m个小字符串&#xff0c;问小字符串拼成大字符串有多少种方法&#xff1f; 答案mod128 题解&#xff1a; 其实也不难&#xff0c;但是本人对于dp及其不敏感&#xff0c;我看出来是…

开源项目商业模式分析(2) - 持续维护的重要性 - Selenium和WatiN

该系列第一篇发布后收到不少反馈&#xff0c;包括&#xff1a;第一篇里说的MonicaHQ不一定盈利没错&#xff0c;但是问题在于绝大多数开源项目商业数据并没有公开&#xff0c;从而无法判断其具体是否盈利。难得MonicaHQ是公开的&#xff0c;所以才用来做这系列文章的开篇。很多…

[SCOI2015]小凸玩矩阵 (匈牙利+二分)

description 题目描述 小凸和小方是好朋友&#xff0c;小方给小凸一个 NM&#xff08;N≤M&#xff09;的矩阵 A&#xff0c;要求小凸从其中选出 N 个数&#xff0c;其中任意两个数字不能在同一行或同一列&#xff0c;现小凸想知道选出来的 N 个数中第 K大的数字的最小值是多…

洛谷P4971:断罪者(左偏树)

解析 看起来就是左偏树的基本操作啊… 然而就是调不过去 吐了qwq 参考了望月大神的实现 感觉清晰的多 就定义并查集维护的是每个点所在的堆的根节点 一下子少了很多恶心的套娃 代码 #include<bits/stdc.h> using namespace std; #define ll long long #define il inl…

CF1267G-Game Relics【数学期望,dp】

正题 题目链接:https://www.luogu.com.cn/problem/CF1267G 题目大意 给出nnn个物品&#xff0c;你可以进行如下操作 花费xxx获得随机一个物品。花费cic_ici​获得第iii个物品。 1≤n≤100,1≤x≤10000,∑ai≤1041\leq n\leq 100,1\leq x\leq 10000,\sum a_i\leq 10^41≤n≤1…

深入业务成为更好的软件架构师——信息化建设图鉴一二例

软件开发实际上跟英语比较类似&#xff0c;都是一项工具&#xff0c;服务于各行各业。从程序员的个人修养上来讲&#xff0c;一是要研习好软件开发这门技艺&#xff0c;二是要深入到所服务的行业。说到底&#xff0c;软件的终极目标是模拟业务&#xff0c;在此期间常常会有一个…

2020牛客暑期多校训练营(第三场)

比赛链接 题号题目通过率AClam and Fish1453/4902BClassical String Problem1547/6542COperation Love1431/5631DPoints Construction Problem548/2238ETwo Matchings943/4141FFraction Construction Problem1034/6445GOperating on a Graph972/4259HSort the Strings Revisio…

文理分科 (最小割问题)

Description 文理分科是一件很纠结的事情&#xff01;&#xff08;虽然看到这个题目的人肯定都没有纠结过&#xff09; 小P所在的班级要进行文理分科。他的班级可以用一个n*m的矩阵进行描述&#xff0c;每个格子代表一个同学的座位。每位同学必须从文科和理科中选择一科。同学…

NOIP2014洛谷P2296:寻找道路(bfs)

解析 杀鸡焉用AS47 做的巨差的一道题 WA3遍写的巨麻烦复杂度被吊打 qwq 说起来很玄学&#xff0c;但第一交之前就有一种强烈的预感觉得自己会WA 一开始像个傻子一样对有环图上记搜 WA了还不知道为啥… 可能真是傻了吧qwq 过了一会看着lojn50,m800干瞪了会眼后终终终于发现了bu…

P7097-[yLOI2020]牵丝戏【dp】

正题 题目链接:https://www.luogu.com.cn/problem/P7097 题目大意 有两个人在打游戏&#xff0c;开始时每个人有个初始伤害xxx和delay值ddd。 有mmm种道具&#xff0c;每个道具一个回合只能用一次&#xff0c;可以使当前回合玩家伤害初始伤害的ki10000\frac{k_i}{10000}1000…

恭贺微软技术俱乐部苏州站正式成立

今天去苏州微软中国&#xff0c;参加了微软技术俱乐部苏州站的成立大会。大会的历程悉数经历&#xff0c;这会儿仍在为各位大佬、社区领袖的奉献精神所感动。在通过我们公司同事分享的链接报名时就了解到&#xff0c;大会上有苏震巍老师和蒋金楠老师的分享&#xff0c;便笃定了…

I. Intersections

I. Intersections 题意&#xff1a; n行&#xff0c;m列&#xff0c;n * m个交点&#xff0c;当我们处于交点&#xff08;i&#xff0c;j&#xff09;&#xff0c; 如果当前时间位于[k * aij k * bij , (k1) * aij k * bij ),我们可以上下移动 如果当前处于[(k1)* aij k *…

[HNOI2013]消毒 (匈牙利最大匹配)

Description 最近在生物实验室工作的小T遇到了大麻烦。 由于实验室最近升级的缘故&#xff0c;他的分格实验皿是一个长方体,其尺寸为abc&#xff0c;a、b、c 均为正整数。为了实验的方便&#xff0c;它被划分为abc个单位立方体区域&#xff0c;每个单位立方体尺寸为111。用(i,…

YbtOJ-变量观测【鸽笼原理】

正题 题目大意 有nnn个数字开始都是000&#xff0c;要求有qqq次操作。 新建一个观测员&#xff0c;观测其中的kkk个数&#xff0c;当这kkk个数从此刻开始变化量不小于ttt时观测结束。将第iii个数加vvv&#xff0c;并输出此时观测结束的观测员编号。 强制在线 1≤n,q≤2105,1…

11.4模拟:总结

解析 110pts 7010300 写三题&#xff0c;挂三题 qwq T1在不同段之间的衔接处犯了个很脑残的错误 T2双向链表l[i]i-1活活写成了l[i]0 结果还能过样例 T3我两个复制的东西改完上面的没改下面的 。。。 qwq 本次做前两题做的有些太快了 样例过了就直接跳了 结果全部挂掉 以后…

.NET Core微服务之路:基于Ocelot的API网关实现--http/https协议篇

前言 最近一直在忙公司和私下的兼职&#xff0c;白天十个小时&#xff0c;晚上四个小时&#xff0c;感觉每天都是打了鸡血似的&#xff0c;精神满满的&#xff0c;连自己那已经学打酱油的娃都很少关心&#xff0c;也有很长一段时间没有更新博客了&#xff0c;特别抱歉&#…

gym 102875A -- Array(未更新完)

gym 102875A – Array 题意&#xff1a; 对于一个数组a&#xff0c;以及数p&#xff0c; q个操作 1.对于区间[l,r]&#xff0c;里面所有数k 2.对于区间[l,r]&#xff0c;里面所有数 * k 3.对于区间[l,r]&#xff0c;里面所有数变成k次幂 4.对于区间[l,r]&#xff0c;输出里面…

[NOI2009] 变换序列 (匈牙利最大匹配)

description … solution 我竟然一眼题&#xff01;&#xff01; 变换后的TTT数组是[0,n)[0,n)[0,n)的排列&#xff0c;变换规则也有&#xff0c;距离DDD也知道 很明显可以求出iii的可能变换对象 这不就是个最大匹配&#xff1f;&#xff1f; 无解就是匹配数量达不到nnn罢了…