bzoj4554: [Tjoi2016&Heoi2016]游戏 二分图匹配
4554: [Tjoi2016&Heoi2016]游戏
Description
Input
Output
输出一个整数a,表示最多能放置炸弹的个数
Sample Input
#∗∗∗
∗#∗∗
∗∗#∗
xxx#
Sample Output
再缩点,在一个连通块的点缩为一点。
令以行为标准的点为左边的点,以列为标准的点为右边的点。
(因为对于地图上的点,一个连通块中只能有一个点放炸弹,以此连接行列,
对应二分图中一个点只能有一个匹配,所以可以把这个看做二分图。)
接着匹配即可。
#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]游戏 二分图匹配的更多相关文章
- BZOJ 4554: [Tjoi2016&Heoi2016]游戏 二分图匹配
4554: [Tjoi2016&Heoi2016]游戏 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4554 Descripti ...
- 4554: [Tjoi2016&Heoi2016]游戏 二分图匹配
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=4554 题解: 如果没有硬石头的话,就是’*‘点对应的行列建边,然后跑最大匹配 硬石头什么 ...
- bzoj4554: [Tjoi2016&Heoi2016]游戏(二分图匹配)
4554: [Tjoi2016&Heoi2016]游戏 题目:传送门 题解: 一道很牛逼的匈牙利..和之前模拟赛的一道题有点相似(不过这题不用完美匹配) 我们可以把连续的行和列全部编号(如果之 ...
- 【BZOJ4554】[Tjoi2016&Heoi2016]游戏 二分图最大匹配
[BZOJ4554][Tjoi2016&Heoi2016]游戏 Description 在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂.简单的说,这个游戏就是在一张地图上放上若干个炸弹,看 ...
- BZOJ4554 - [TJOI2016&HEOI2016]游戏
原题链接 Description 给出一个的地图,地图上有空地.软石头和硬石头.求在这张地图上最多能放上多少个炸弹能使得任意两个炸弹之间不会互相炸到.炸弹能炸到的范围是该炸弹所在的一行和一列,炸弹的威 ...
- [BZOJ4554][TJOI2016&&HEOI2016]游戏(匈牙利)
4554: [Tjoi2016&Heoi2016]游戏 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 857 Solved: 506[Sub ...
- BZOJ4554: [Tjoi2016&Heoi2016]游戏
Description 在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂.简单的说,这个游戏就是在一张地图上放上若干个炸弹,看 是否能炸到对手,或者躲开对手的炸弹.在玩游戏的过程中,小H想到了这样一 ...
- BZOJ 4554 [Tjoi2016&Heoi2016]游戏 ——二分图
出原题,直接二分图匹配即可. #include <cstdio> #include <vector> #include <cstring> using namesp ...
- BZOJ4554: [Tjoi2016&Heoi2016]游戏 luoguP2825 loj2057
题面描述:尽可能多的放置符合要求的炸弹. 分析: 在i,j处放置炸弹,则在第i行,上一个硬石头之后,下一个硬石头之前,第j列,上一个硬石头之后,下一个硬石头之前,不能再次放置炸弹. 首先,这个题,一看 ...
随机推荐
- Android L(5.0)源码之图形与图像处理之简单图片——Bitmap
最近在研究android 5.0的gallery模块,学习了相关的知识点,准备写点博客总结一下,有时间了会补充完整
- S3C2440 TFTLCD驱动详解
S3C2440自带有LCD控制器,该控制器主要有以下接口 仅仅说TFT显示器,TFT显示器的时序如下 TFT显示器的驱动是以行列的形式逐点扫描过来的,驱动时钟有三种,一种是行时钟,一种是列时钟,还有一 ...
- php 中文切割字符串长度
function msubstr($str, $start=0, $length, $charset="utf-8", $suffix=true) { if(function_ex ...
- windows下Nodejs环境部署
前言 Nodejs是基于v8引擎的轻量级框架,其特点为事件驱动.非阻塞.单线程.异步回调等. Nodejs相对于其他运行在服务器端的语言,容易学习,使用方便. 本文将介绍windows下Nodejs的 ...
- 转自他人——————TLE之前,没有一个节点叫失败!!!
我想我十八年来记忆最深刻的夜晚,大概便是在吉林大学燥热的宿舍里,穿着橘黄色的短袖,努力咽下大口大口的雪碧.那天晚上我仰躺在吉大热得几乎不能入眠的床板上,一动不动,看夏夜里打不尽的蚊子在惨白的天花板下飞 ...
- 在官网下载了最新版的PHP,解压后的安装包里为什么没有php5isapi.dll这个dll文件?
因为自PHP 5.3.1版本开始,PHP便已不在支持ISAPI模式,所以你在PHP5.3.1版本以上的php目录中看不到php5isapi.dll文件. 那么,IIS6下跑PHP 5.3.1以上版本时 ...
- Jq对象与dom对象的互相转换!
JQ对象转化成dom对象 var a=$('div'); var b=a[0];//dom对象 转化成dom对象以后就可以使用dom方法了 dom对象转化成jq对象 var a=document.ge ...
- 递归求和1到n
一般的方法 #include<stdio.h> int sum(int n){ if(n==1) return 1; else return n+sum(n-1);} int main(v ...
- ImageView及其子类(一)
ImageView继承自View组件,它的主要功能是用于显示图片——实际上这个书法不太严谨因为他能显示的不仅是图片,任何Drawable对象都可以使用ImageView来显示.除此之外,ImageVi ...
- spring mvc上传下载文件
前端jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEnc ...