当前位置: 首页 > news >正文

[BZOJ4554][TJOI2016HEOI2016]游戏(匈牙利)

4554: [Tjoi2016&Heoi2016]游戏

Time Limit: 20 Sec  Memory Limit: 128 MB
Submit: 857  Solved: 506
[Submit][Status][Discuss]

Description

在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂。简单的说,这个游戏就是在一张地图上放上若干个炸弹,看
是否能炸到对手,或者躲开对手的炸弹。在玩游戏的过程中,小H想到了这样一个问题:当给定一张地图,在这张
地图上最多能放上多少个炸弹能使得任意两个炸弹之间不会互相炸到。炸弹能炸到的范围是该炸弹所在的一行和一
列,炸弹的威力可以穿透软石头,但是不能穿透硬石头。给定一张n*m的网格地图:其中*代表空地,炸弹的威力可
以穿透,可以在空地上放置一枚炸弹。x代表软石头,炸弹的威力可以穿透,不能在此放置炸弹。#代表硬石头,炸
弹的威力是不能穿透的,不能在此放置炸弹。例如:给出1*4的网格地图*xx*,这个地图上最多只能放置一个炸弹
。给出另一个1*4的网格地图*x#*,这个地图最多能放置两个炸弹。现在小H任意给出一张n*m的网格地图,问你最
多能放置多少炸弹

Input

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

Output

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

Sample Input

```
4 4
#***
*#**
**#*
xxx#
```

Sample Output

5

HINT

Source

TJOI2016的题目都是联赛难度的,但我还是做得令人很不满意,说明在基础算法方面有很大欠缺,不能再本末倒置了。

这题是比较经典的二分图模型,对于每个可以放炸弹的格子,x->y连一条边,这样跑最大匹配之后就能保证任意两个炸弹不在同一行或同一列内了。

但是硬石头怎么办呢,很简单直接将行和列拆成两边,新建节点即可。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define mem(a) memset(a,0,sizeof(a))
 5 #define rep(i,l,r) for (int i=l; i<=r; i++)
 6 using namespace std;
 7 
 8 const int N=2510;
 9 int n,m,tx,ty,now,ans,cnt;
10 int to[N],nxt[N],h[N],lnk[N],vis[N],bel[60][60];
11 char str[60][60];
12 
13 void add(int a,int b){ to[++cnt]=b; nxt[cnt]=h[a]; h[a]=cnt; }
14 
15 int dfs(int x){
16     for (int i=h[x],k; i; i=nxt[i]) if (!vis[k=to[i]]){
17         vis[k]=1;
18         if (!lnk[k] || dfs(lnk[k])) { lnk[k]=x; return 1; }
19     }
20     return 0;
21 }
22 
23 int main(){
24     freopen("bzoj4554.in","r",stdin);
25     freopen("bzoj4554.out","w",stdout);
26     scanf("%d%d",&n,&m); tx=ty=1;
27     rep(i,1,n){
28         scanf("%s",str[i]+1);
29         rep(j,1,m) if (str[i][j]=='#') tx++; else bel[i][j]=tx;
30         if (str[i][m]!='#') tx++;
31     }
32     rep(j,1,m){
33         rep(i,1,n){
34             if (str[i][j]=='#') ty++;
35             if (str[i][j]=='*') add(bel[i][j],ty);
36         }
37         if (str[n][j]!='#') ty++;
38     }
39     rep(x,1,tx) mem(vis),ans+=dfs(x);
40     printf("%d\n",ans);
41     return 0;
42 }

 

转载于:https://www.cnblogs.com/HocRiser/p/8580231.html

相关文章:

  • POJ 1147 Binary Codes 杂题
  • 浅谈过去,畅想未来
  • POJ 2286 The Rotation Game IDA*
  • LeetCode 67. Add Binary
  • HDU 4016 Magic Bitwise And Operation 暴搜+剪枝
  • 20165314 2016-2017-2 《Java程序设计》第3周学习总结
  • HDU 4090 GemAnd Prince 暴搜+剪枝
  • XML作用
  • ReportViewer:隐藏和GetDefaultPageSettings
  • ETL总结(扫盲版)
  • sql server 内置MD5加密函数
  • POJ 1011 Sticks 强大的剪枝
  • 2018/3/20 noip模拟赛 5分
  • windows2003 with OpenSSH
  • java和c#通过esb服务互调用组件
  • Android组件 - 收藏集 - 掘金
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • isset在php5.6-和php7.0+的一些差异
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • jquery cookie
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Linux gpio口使用方法
  • Material Design
  • PHP的Ev教程三(Periodic watcher)
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 搞机器学习要哪些技能
  • 前端_面试
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • ​学习一下,什么是预包装食品?​
  • ![CDATA[ ]] 是什么东东
  • # include “ “ 和 # include < >两者的区别
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (第一天)包装对象、作用域、创建对象
  • (附源码)ssm码农论坛 毕业设计 231126
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .Net FrameWork总结
  • /etc/sudoer文件配置简析
  • [383] 赎金信 js
  • [AS3]URLLoader+URLRequest+JPGEncoder实现BitmapData图片数据保存
  • [bzoj4010][HNOI2015]菜肴制作_贪心_拓扑排序
  • [C++ 从入门到精通] 12.重载运算符、赋值运算符重载、析构函数
  • [cocos creator]EditBox,editing-return事件,清空输入框
  • [Excel VBA]单元格区域引用方式的小结
  • [go] 迭代器模式
  • [InnoDB系列] -- SHOW INNODB STATUS 探秘
  • [LeetCode] Wildcard Matching
  • [Linux_IMX6ULL应用开发]-Makefile
  • [OS-Linux] CentOS 7.x 使用密钥登录安全设置
  • [P7885][Android13] 解决5G信号良好状态栏信号只有两格的问题