传送门

Description

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

Input

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

Output

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

Sample Input

  1. 4 4
  2. #∗∗∗
  3. ∗#∗∗
  4. ∗∗#∗
  5. xxx#

Sample Output

5

Solution

实际上就是互相影响的不能同时选择

把图按照块编号后跑最大匹配

Code

  1. //By Menteur_Hxy
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <iostream>
  6. #include <algorithm>
  7. #define F(i,a,b) for(register int i=(a);i<=(b);i++)
  8. #define E(i,u) for(register int i=head[u];i;i=nxt[i])
  9. #define ins(a,b,c) add(a,b,c),add(b,a,0)
  10. #define add(a,b,c) nxt[++cnt]=head[a],to[cnt]=b,cst[cnt]=c,head[a]=cnt
  11. using namespace std;
  12. int read() {
  13. int x=0,f=1; char c=getchar();
  14. while(!isdigit(c)) {if(c=='-')f=-f; c=getchar();}
  15. while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
  16. return x*f;
  17. }
  18. const int N=1010,INF=0x3f3f3f3f;
  19. int n,m,xid,yid,S,T,cnt;
  20. int nxt[N*N],to[N*N],cst[N*N],head[N*N],cur[N*N];
  21. int map[N][N],dx[N][N],dy[N][N],que[N*N<<2],dis[N*N];
  22. bool bfs() {
  23. memset(dis,0,sizeof(dis));
  24. int h=0,t=1; que[++h]=S; dis[S]=1;
  25. while(h<=t) {
  26. int u=que[h++];
  27. E(i,u) if(!dis[to[i]]&&cst[i]>0)
  28. dis[to[i]]=dis[u]+1,que[++t]=to[i];
  29. }
  30. return dis[T];
  31. }
  32. int dfs(int u,int flow) {
  33. if(u==T) return flow;
  34. int used=0;
  35. for(register int &i=cur[u],v;i;i=nxt[i])
  36. if(cst[i]>0&&dis[(v=to[i])]==dis[u]+1) {
  37. int tmp=dfs(v,min(flow-used,cst[i]));
  38. cst[i]-=tmp,cst[i^1]+=tmp;
  39. used+=tmp; if(used==flow) return flow;
  40. }
  41. if(!used) dis[u]=-1;
  42. return used;
  43. }
  44. int dinic() {
  45. int res=0;
  46. while(bfs()) {
  47. F(i,0,T) cur[i]=head[i];
  48. res+=dfs(S,INF);
  49. }
  50. return res;
  51. }
  52. int main() {
  53. n=read(),m=read();
  54. F(i,1,n) {
  55. scanf("\n");
  56. F(j,1,m) {
  57. char ch=getchar();
  58. if(ch=='x') map[i][j]=1;
  59. else if(ch=='#') map[i][j]=2;
  60. }
  61. }
  62. F(i,1,n) {
  63. xid++;
  64. F(j,1,m)
  65. dx[i][j]=xid,xid+=(map[i][j]==2);
  66. }
  67. F(i,1,m) {
  68. yid++;
  69. F(j,1,n)
  70. dy[j][i]=yid,yid+=(map[j][i]==2);
  71. }
  72. S=0,T=xid+yid+1,cnt=1;
  73. F(i,1,xid) ins(S,i,1); F(i,1,yid) ins(i+xid,T,1);
  74. F(i,1,n) F(j,1,m) if(!map[i][j])
  75. ins(dx[i][j],dy[i][j]+xid,1);
  76. printf("%d",dinic());
  77. return 0;
  78. }

[luogu2825 HEOI2016/TJOI2016] 游戏 (二分图最大匹配)的更多相关文章

  1. [ZJOI2007]矩阵游戏【bzoj1059/洛谷1129】/ [HEOI2016/TJOI2016]游戏

    小QQ是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏.矩阵游戏在一个N \times NN×N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种 ...

  2. [HEOI2016/TJOI2016]游戏 解题报告

    [HEOI2016/TJOI2016]游戏 看起来就是个二分图匹配啊 最大化匹配是在最大化边数,那么一条边就代表选中一个坐标内的点 但是每一行不一定只会有一个匹配 于是把点拆开,按照'#'划分一下就好 ...

  3. 【BZOJ1854】[Scoi2010]游戏 二分图最大匹配

    [BZOJ1854][Scoi2010]游戏 Description lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当 ...

  4. 【bzoj1059】[ZJOI2007]矩阵游戏 二分图最大匹配

    题目描述 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种操作:行交换 ...

  5. 【BZOJ4554】[Tjoi2016&Heoi2016]游戏 二分图最大匹配

    [BZOJ4554][Tjoi2016&Heoi2016]游戏 Description 在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂.简单的说,这个游戏就是在一张地图上放上若干个炸弹,看 ...

  6. BZOJ 1059 [ZJOI2007]矩阵游戏 (二分图最大匹配)

    1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5281  Solved: 2530[Submit][Stat ...

  7. [HEOI2016/TJOI2016]游戏

    Description: 在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂.简单的说,这个游戏就是在一张地图上放上若干个炸弹,看是否能炸到对手,或者躲开对手的炸弹.在玩游戏的过程中,小H想到了这样一 ...

  8. [luogu1640 SCOI2010]连续攻击游戏 (二分图最大匹配)

    传送门 Description lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某 ...

  9. P1640 [SCOI2010]连续攻击游戏 二分图最大匹配 匈牙利算法

    题目描述 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一个属性.并且每种装备 ...

随机推荐

  1. 每一个程序猿必知之SEO

    似乎由于受这篇文章的影响 http://katemats.com/what-every-programmer-should-know-about-seo/ 于是我也觉得我应该写一个每一个程序猿必知之S ...

  2. CSS3选择器(全)

    CSS选择器复习 通用选择器:* 选择到全部的元素 选择子元素:> 选择到元素的直接后代(第一级子元素) 相邻兄弟选择器:+ 选择到紧随目标元素后的第一个元素 普通兄弟选择器:~ 选择到紧随其后 ...

  3. SqlService Date 格式化

    <choose> <when test="dateFlag=='day'"> ), FRI.INVOICE_DATE, ) AS CREATED_ON, & ...

  4. luogu1415 拆分数列

    题目大意 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数.如果有多组解,则输出使得最后一个数最小的同时,字典序最大的解(即先要满足最后一个数最小:如果有多组解,则使得第一个数尽量大:如 ...

  5. 杂项-Java:EL表达式

    ylbtech-杂项-Java:EL表达式 EL(Expression Language) 是为了使JSP写起来更加简单.表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提 ...

  6. openStack 主机流量计运行状态 随笔记录

    root@ruiy-controller:~# ifconfigeth0      Link encap:Ethernet  HWaddr 0c:c4:7a:0d:97:2c          ine ...

  7. E20170907-ts

    flash  vt. 使闪光,使闪烁; 拍出,发出(电报等); 〈口〉炫耀;          adj. 闪光的,闪耀的,一闪而过的; 浮华的; 庞大的;           n. 闪光; 闪光灯下摄 ...

  8. Gold Balanced Lineup(hash)

    http://poj.org/problem?id=3274 ***** #include <stdio.h> #include <iostream> #include < ...

  9. Docker 探索安装WordPress+Mysql8.0

    拉取MYSQL,注意默认是8.0版本,连接加密方式有变化 docker pull mysql 运行MYSQL docker run --name wordpress-mysql -p 3306:330 ...

  10. Echarts配置

    直接引入echarts 安装echarts项目依赖 cnpm install echarts --save //或者 cnpm i echarts -S   全局引入 我们安装完成之后,可以在 mai ...