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

【BZOJ4554】[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 <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int to[2510],next[2510],head[2510],from[2510],vis[2510];
int bel[60][60];
int n,m,tx,ty,now,ans,cnt;
char str[60][60];
void add(int a,int b)
{
	to[cnt]=b;
	next[cnt]=head[a];
	head[a]=cnt++;
}
int dfs(int x)
{
	for(int i=head[x];i!=-1;i=next[i])
	{
		if(vis[to[i]]==now)	continue;
		vis[to[i]]=now;
		if(!from[to[i]]||dfs(from[to[i]]))
		{
			from[to[i]]=x;
			return 1;
		}
	}
	return 0;
}
int main()
{
	scanf("%d%d",&n,&m);
	int i,j;
	memset(head,-1,sizeof(head));
	tx=ty=1;
	for(i=1;i<=n;i++)
	{
		scanf("%s",&str[i]);
		for(j=1;j<=m;j++)
		{
			if(str[i][j-1]==‘#‘)	tx++;
			else bel[i][j]=tx;
		}
		if(str[i][m-1]!=‘#‘)	tx++;
	}
	for(j=1;j<=m;j++)
	{
		for(i=1;i<=n;i++)
		{
			if(str[i][j-1]==‘#‘)	ty++;
			if(str[i][j-1]==‘*‘)	add(bel[i][j],ty);
		}
		if(str[n][j-1]!=‘#‘)	ty++;
	}
	for(now=1;now<=tx;now++)	ans+=dfs(now);
	printf("%d",ans);
	return 0;
}
时间: 2024-10-19 21:27:29

【BZOJ4554】[Tjoi2016&Heoi2016]游戏 二分图最大匹配的相关文章

二分图 BZOJ4554 [Tjoi2016&amp;Heoi2016]游戏

4554: [Tjoi2016&Heoi2016]游戏 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 579  Solved: 350[Submit][Status][Discuss] Description 在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂.简单的说,这个游戏就是在一张地图上放上若干个炸弹,看 是否能炸到对手,或者躲开对手的炸弹.在玩游戏的过程中,小H想到了这样一个问题:当给定一张地图,在这张 地图上最多能放上多少个炸弹能使得

[bzoj4554] [Tjoi2016&amp;Heoi2016]游戏

传送门 网络流的题目做的还真不是很多,这种题目很容易看出是网络流,但就是不怎么会建图. 如果没有硬石头,就是一个经典的二分图匹配问题. 但是有硬石头存在,由于硬石头对前后左右的状态不会发生传递,因此,可以以硬石头为界建立联通块. 然后跑网络流就行了. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<

4554: [Tjoi2016&amp;Heoi2016]游戏 二分图匹配

题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=4554 题解: 如果没有硬石头的话,就是’*‘点对应的行列建边,然后跑最大匹配 硬石头什么作用?它可以让同一行或同一列存在不只一个炸弹,因此我们可以将一个硬石头的上下拆成两列,左右拆成两行,然后就可以用经典的做法来跑最大匹配了. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #incl

BZOJ 1854 SCOI2010 游戏 二分图最大匹配/并查集

题目大意:给定n个武器,每个武器有两个属性,只能使用其中一个,要求选择一些武器 可以造成形如1 2 3 4的伤害 求最大伤害 题目大意我没写明白还是去看原题把QAQ 做法1: 同 1191 每个武器向两个属性连边 然后从1~10000枚举属性 跑二分图最大匹配 无法匹配则输出答案 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define M 100100

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

题目描述 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一个属性.并且每种装备最多只能使用一次.游戏进行到最后,lxhgww遇到了终极boss,这个终极boss很奇怪,攻击他的装备所使用的属性值必须从1开始连续递增地攻击,才能对boss产生伤害.也就是说一开始的时候,lxhgww只能使用某个属性值为1的装备攻击boss,然后只能使用某个属性值为2的装备攻击boss,然后只能使

BZOJ 1854: [Scoi2010]游戏( 二分图最大匹配 )

匈牙利算法..从1~10000依次找增广路, 找不到就停止, 输出答案. ---------------------------------------------------------------------------- #include<bits/stdc++.h> using namespace std; const int MAXL = 10009, MAXR = 1000009; struct edge { int to; edge* next; } E[MAXR <<

BZOJ 1854 SCOI 2010 游戏 二分图最大匹配

题目大意:现在要打一个BOSS,一个人有n个武器,一个武器有两个属性值,但是一个武器只能攻击一次.这个BOSS需要从1连续递增输出,问输出的最大值为多少. 思路:以前好像做过一个相似的问题,也是这么做的,哪个忘了.. 很明显的二分关系是攻击力和武器,因为一个攻击力需要攻击一次,一个武器只能攻击一次,然后武器和攻击力之间连边,从1开始匹配,什么时候不能匹配了就输出. memset会T的,时间戳大法好. CODE: #include <cstdio> #include <cstring>

bzoj45544554: [Tjoi2016&amp;Heoi2016]游戏

匈牙利. 这题感觉上跟之前羊老师出的题挺像?只不过前面那题是完美匹配? 把它分成横纵坐标分联通块匹配就好. #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; int n,m; int xcnt,xbe[1100][1100],ycnt,ybe[1100][1100]; char ss[1100][1100]; bool

bzoj4554【TJOI2016&amp;HEOI2016】游戏

4554: [Tjoi2016&Heoi2016]游戏 Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 266  Solved: 167 [Submit][Status][Discuss] Description 在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂.简单的说,这个游戏就是在一张地图上放上若干个炸弹,看 是否能炸到对手,或者躲开对手的炸弹.在玩游戏的过程中,小H想到了这样一个问题:当给定一张地图,在这张 地图上最多能放上多少个炸弹能