4554: [Tjoi2016&Heoi2016]游戏

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
 
最近在学二分图匹配,随便找了一道发现完全没有思路……没有看出来是二分图匹配……
思维不够活跃还没有形成套路啊
正式讲一下做法……
每个点看成一条边,拆点,将每个点分别拆成以行,列为标准的两点,遇到#视为换行/列,
再缩点,在一个连通块的点缩为一点。
令以行为标准的点为左边的点,以列为标准的点为右边的点。
(因为对于地图上的点,一个连通块中只能有一个点放炸弹,以此连接行列,
对应二分图中一个点只能有一个匹配,所以可以把这个看做二分图。)
接着匹配即可。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
#define Max 205
int n,m,num1=1,num2=1,dis=Max,res=0;
char s[100][100];
int x[3000][1300],y[3000][3000],mp[3000][3000],dx[10000],dy[10000],cx[10000],cy[10000],vis[10000],pdx[10000],pdy[10000];
int bfs()
{
memset(dx,0,sizeof(dx));
memset(dy,0,sizeof(dy));
dis=Max;
queue<int> q;
for (int i=1;i<=num1;i++)
{
if (!cx[i]&&pdx[i])
q.push(i);
}
while (!q.empty())
{
int u=q.front();
q.pop();
if (dx[u]>dis) break;
for (int i=1;i<=num2;i++)
{
if (mp[u][i]&&!dy[i]&&pdy[i])
{
dy[i]=dx[u]+1;
if (!cy[i]) dis=dy[i];
else
{
dx[cy[i]]=dy[i]+1;
q.push(cy[i]);
}
}
}
}
return dis!=Max;
}
int find(int u)
{
for (int i=1;i<=num2;i++)
{
if (!vis[i]&&mp[u][i]&&dy[i]==dx[u]+1&&pdy[i])
{
vis[i]=1;
if (cy[i]&&dy[i]==dis) continue;
if (!cy[i]||find(cy[i]))
{
cx[u]=i;cy[i]=u;
return 1;
}
}
}
return 0;
} int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) scanf("%s",s[i]+1);//输入
for (int i=1;i<=n;i++)//以行为标准
{
for (int j=1;j<=m;j++)
{
if (s[i][j]=='#') num1++;//每个num1相同的点即可缩为一个点
x[i][j]=num1;
pdx[num1]=1;
}
num1++;
}
for (int j=1;j<=m;j++)//以列为标准
{
for (int i=1;i<=n;i++)
{
if (s[i][j]=='#') num2++;//同上
y[i][j]=num2;
pdy[num2]=1;
}
num2++;
}
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
if(s[i][j]=='*')//连边
{
mp[x[i][j]][y[i][j]]=1;
//mp[y[i][j]][x[i][j]]=1;
}
}
while (bfs())//二分图匹配,这里用的hopcroft-karp算法,主要想练一下……
{
memset(vis,0,sizeof(vis));
for (int i=1;i<=num1;i++)
{
if (!cx[i]&&pdx[i])
res+=find(i);
}
} cout<<res;
return 0;
}

bzoj4554: [Tjoi2016&Heoi2016]游戏 二分图匹配的更多相关文章

  1. BZOJ 4554: [Tjoi2016&Heoi2016]游戏 二分图匹配

    4554: [Tjoi2016&Heoi2016]游戏 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4554 Descripti ...

  2. 4554: [Tjoi2016&Heoi2016]游戏 二分图匹配

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=4554 题解: 如果没有硬石头的话,就是’*‘点对应的行列建边,然后跑最大匹配 硬石头什么 ...

  3. bzoj4554: [Tjoi2016&Heoi2016]游戏(二分图匹配)

    4554: [Tjoi2016&Heoi2016]游戏 题目:传送门 题解: 一道很牛逼的匈牙利..和之前模拟赛的一道题有点相似(不过这题不用完美匹配) 我们可以把连续的行和列全部编号(如果之 ...

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

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

  5. BZOJ4554 - [TJOI2016&HEOI2016]游戏

    原题链接 Description 给出一个的地图,地图上有空地.软石头和硬石头.求在这张地图上最多能放上多少个炸弹能使得任意两个炸弹之间不会互相炸到.炸弹能炸到的范围是该炸弹所在的一行和一列,炸弹的威 ...

  6. [BZOJ4554][TJOI2016&&HEOI2016]游戏(匈牙利)

    4554: [Tjoi2016&Heoi2016]游戏 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 857  Solved: 506[Sub ...

  7. BZOJ4554: [Tjoi2016&Heoi2016]游戏

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

  8. BZOJ 4554 [Tjoi2016&Heoi2016]游戏 ——二分图

    出原题,直接二分图匹配即可. #include <cstdio> #include <vector> #include <cstring> using namesp ...

  9. BZOJ4554: [Tjoi2016&Heoi2016]游戏 luoguP2825 loj2057

    题面描述:尽可能多的放置符合要求的炸弹. 分析: 在i,j处放置炸弹,则在第i行,上一个硬石头之后,下一个硬石头之前,第j列,上一个硬石头之后,下一个硬石头之前,不能再次放置炸弹. 首先,这个题,一看 ...

随机推荐

  1. mustache.js使用基本(二)sections

    作者:zccst 本文记录基本使用二,主要讲sections. {{#person}} {{/person}} 1,当person是null, undefined, false, 0, NaN, &q ...

  2. php上传zip文件在线解压文件在指定目录下,CI框架版本

    我从网上找的文件php在线解压zip压缩文件 文件为jy.php可以直接执行,但是怎样将其加到CI框架中呢?? jy.php文件 <?php header("content-Type: ...

  3. Spring学习---JPA学习笔记

    用了一段时间的Spring,到现在也只是处于会用的状态,对于深入一点的东西都不太了解.所以决定开始深入学习Spring. 本文主要记录JPA学习.在学习JPA之前,需要了解一些ORM的概念. ORM概 ...

  4. STM32硬件IIC操作

    Stm32具有IIC接口,接口有以下主要特性 多主机功能:该模块既可做主设备也可做从设备 主设备功能 C地址检测 位/10位地址和广播呼叫 支持不同的通讯速度 状态标志: 发送器/接收器模式标志 字节 ...

  5. Powerbuilder编程技巧 如何获取网页的HTML源码

    直接使用的三种方式 1.  PB内部对象 Inet object 2.  API 函数 3.  Ole中的Microsfot Web 游览器对象 一.Inet object: 1.Inet objec ...

  6. BZOJ 1257 [CQOI2007]余数之和sum ——Dirichlet积

    [题目分析] 卷积很好玩啊. [代码] #include <cstdio> #include <cstring> #include <cmath> #include ...

  7. radioButton添加试题选项webview(二)

    由于项目里radioGroup里,4个选项里加载的是webview,而不是radiobutton本身自己可设置的text类型,并且每个webview都需要和radiobutton对齐,所以这个布局有点 ...

  8. java监听事件

    2014年2月23日 09:51:54 成功添加了打开官网的事件, 回头研究下,那个打开url的类 java的System.getProperty()方法可以获取的值 ################ ...

  9. 优酷、YouTube、Twitter及JustinTV几个视频网站的架构

      优酷视频网站架构 一.网站基本数据概览据2010年统计,优酷网日均独立访问人数(uv)达到了8900万,日均访问量(pv)更是达到了17亿,优酷凭借这一数据成为google榜单中国内视频网站排名最 ...

  10. [UT]Unit Test理解

    Coding中有一个原则:Test Driven Development.  UT中的一些基本概念: 1. 测试驱动 2. 测试桩 3. 测试覆盖 4. 覆盖率 单体测试内容: 1. 模块接口:测试模 ...