hdu 5093 Battle ships(二分图最大匹配)
题意:
M*N的矩阵,每个格子上是三个之一:*、o、#。 (1 <= m, n <= 50)
*:海洋,战船可以停在上面。 o:浮冰,战船不可以停在上面 #:冰山,战船不可以停在上面。
限制:两艘战船不能处于同一行或同一列,除非它们之间有冰山挡着。
问最多可以停多少艘战船。
思路:
和二分图最小点覆盖那道经典题很相似。不过不是求最小点覆盖。
对于每一行,如果连续的一段只能放一艘战船,则将这一段视为同一个点。则每一行都被分为若干个小段,即若干个点。将这些点作为二分图的左部X集合。
对于每一列,同理。
对于(i,j)若这点可以放一艘战船,则将其对应在X集合中的位置与对应在Y集合中的位置连一条线。(实质上:每一条线代表一个可以放一艘战船的位置)
求二分图的最大匹配即是答案。
代码:
int T,m,n;
char mapp[55][55];
char temp[55];
int row[55][55], col[55][55];
int cc1,cc2;
int cx[2505], cy[2505];
bool bmask[2505];
vector<int> graph[2505]; int findPath(int u){
int L=graph[u].size();
rep(i,0,L-1){
int v=graph[u][i];
if(!bmask[v]){
bmask[v]=true;
if(cy[v]==-1||findPath(cy[v])){
cy[v]=u;
cx[u]=v;
return 1;
}
}
}
return 0;
}
int MaxMatch(){
int ans=0;
rep(i,1,cc1) cx[i]=-1;
rep(i,1,cc2) cy[i]=-1;
rep(i,1,cc1) if(cx[i]==-1){
mem(bmask,false);
ans+=findPath(i);
}
return ans;
} int main(){
//freopen("test.in","r",stdin);
cin>>T;
while(T--){
scanf("%d%d",&m,&n);
rep(i,0,m-1) scanf("%s",mapp[i]);
cc1=0, cc2=0;
mem(row,0); mem(col,0);
rep(i,0,m-1){
rep(j,0,n-1) temp[j]=mapp[i][j];
int p=0;
while(p<n){
while(p<n&&temp[p]!='*') ++p;
if(p<n) ++cc1;
while(p<n&&temp[p]!='#') {row[i][p]=cc1; ++p;}
}
} rep(j,0,n-1){
rep(i,0,m-1) temp[i]=mapp[i][j];
int p=0;
while(p<m){
while(p<m&&temp[p]!='*') ++p;
if(p<m) ++cc2;
while(p<m&&temp[p]!='#') {col[p][j]=cc2; ++p;}
}
}
rep(i,1,cc1) graph[i].clear();
rep(i,0,m-1) rep(j,0,n-1) if(mapp[i][j]=='*') graph[row[i][j]].push_back(col[i][j]); int dd=MaxMatch();
printf("%d\n",dd);
}
//fclose(stdin);
}
hdu 5093 Battle ships(二分图最大匹配)的更多相关文章
- HDU 5093 Battle ships(二分图最大匹配)
题意:一个m行n列的图由#.*.o三种符号组成,分别代表冰山.海域.浮冰,问最多可放的炮舰数(要求满足以下条件) 1.炮舰只可放在海域处 2.两个炮舰不能放在同一行或同一列(除非中间隔着一个或多个冰山 ...
- hdu 5093 Battle ships (二分图)
二分图最大匹配问题 遇到冰山就把行列拆成两个部分.每个部分x也好,y也好只能匹配一次 图画得比较草,将就着看 横着扫一遍,竖着扫一遍,得到编号 一个位置就对应一个(xi,yi)就是X集到Y集的一条边, ...
- HDOJ 5093 Battle ships 二分图匹配
二分图匹配: 分别按行和列把图展开.hungary二分图匹配. ... 例子: 4 4 *ooo o### **#* ooo* 按行展开. .. . *ooo o#oo oo#o ooo# **#o ...
- hdu 5093 Battle ships
二分图匹配 #include<cstdio> #include<cstring> #include<iostream> #include<cmath> ...
- hdu 5093 Battle ships 匈牙利 很巧妙的建图思路
//这题逼我把匈牙利学了 之前一直很勤快敲网络流 而且不以为耻反以为荣 解:首先按行扫描编号,如果在同一块中(即可以相互攻击),那么将其标为相同的数组,对列也做同样的操作. 然后扫描整张图,如果行编号 ...
- hdoj 5093 Battle ships 【二分图最大匹配】
题目:pid=5093" target="_blank">hdoj 5093 Battle ships 题意:给你一个n*m的图,图中有冰山 '# ',浮冰 'o' ...
- Battle ships(二分图,建图,好题)
Battle ships Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Tot ...
- HDU - 1045 Fire Net (二分图最大匹配-匈牙利算法)
(点击此处查看原题) 匈牙利算法简介 个人认为这个算法是一种贪心+暴力的算法,对于二分图的两部X和Y,记x为X部一点,y为Y部一点,我们枚举X的每个点x,如果Y部存在匹配的点y并且y没有被其他的x匹配 ...
- hdu 1083 Courses(二分图最大匹配)
题意: P门课,N个学生. (1<=P<=100 1<=N<=300) 每门课有若干个学生可以成为这门课的代表(即候选人). 又规定每个学生最多只能成为一门课的代 ...
随机推荐
- 个人作业——CVPR顶会论文爬取
main.py #保存单个界面数据 def getInfo(url): # url='https://openaccess.thecvf.com/WACV2021' header={ 'User-Ag ...
- HCNP Routing&Switching之路由控制、路由策略和IP-Prefix List
前文我们了解了IS-IS路由聚合和认证相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15306645.html:今天我们来聊一聊路由控制技术中的路由策 ...
- 使用Java操作Excel表格
目录 一.配置第三方库 二.使用Apache POI API 1. 打开Excel文件 2. 选择对应的sheet 3. Sheet接口的基本使用 3.1 获取开头行和结束行 3.2 获取Row对象 ...
- GCN数据集Cora、Citeseer、Pubmed文件分析
简介 本文将对Cora.Citeseer.Pubmed 数据集进行详细介绍 Cora.Citeseer.Pubmed 数据集 来源 图 节点 边 特征 标签(y) Cora "Collect ...
- MySQL之索引复合索引有效性
首先这里建立一张数据表,并建立符合索引( index_A,index_B,index_C) CREATE TABLE `test_index_sequence` ( `Id` int(11) NOT ...
- sunny 内网穿透使用。
启动方法:
- 51nod1600-Simple KMP【SAM,树链剖分】
正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1600 题目大意 给出一个字符串\(s\),每次在最后插入一个字符后求它的 ...
- HttpRunner3.X - 全面讲解如何落地项目实战
一.前言 接触httprunner框架有一段时间了,也一直探索如何更好的落地到项目上,本篇主要讲述如何应用到实际的项目中,达到提升测试效率的目的. 1.项目难题 这个月开始忙起来了,接了个大项目,苦不 ...
- Serverless 如何在阿里巴巴实现规模化落地?
作者 | 赵庆杰(卢令) 来源 | Serverless 公众号 一.Serverless 规模化落地集团的成果 2020 年,我们在 Serverless 底层基建上做了非常大的升级,比如计算升级到 ...
- Tomcat各种日志的关系与catalina.out文件的分割
Tomcat 各日志之间的关系 一图胜千言! 其他日志如localhost.{yyyy-MM-dd}.log.localhost-access.{yyyy-MM-dd}.log是context的名称, ...