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) 每门课有若干个学生可以成为这门课的代表(即候选人). 又规定每个学生最多只能成为一门课的代 ...
随机推荐
- XSS注入
XSS 原理: 程序对输入和输出没有做合适的处理,导致"精心构造"的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害. 分类 : 危害:存储型 > 反射型 > ...
- Elasticsearch(ES)的高级搜索(DSL搜索)(下篇)
1. 概述 之前聊了Elasticsearch(ES)的高级搜索(DSL搜索)的一部分内容,今天把剩下的部分聊完. 2. 场景说明 2.1 创建索引同时创建映射 PUT http://192.168 ...
- input竖直的输入框,文字从上到下排列
有的时候可能会有这样的需求,一个竖直的输入框,输入信息,文字也是从上到下排列: (但是在移动端或用轮播swiper时不起作用,可以用textarea代替input) <!DOCTYPE html ...
- css3 animate转圈360旋转
.logo{ width:20px; height: 20px; background: red; -webkit-animation:haha1 .8s linear infinite; anima ...
- Java面向对象系列(2)- 回顾方法的定义
方法的定义 修饰符 返回类型 break:跳出switch,结束循环和return的区别 方法名:注意规范,见名知意 参数列表:(参数类型,参数名) 异常抛出 package oop.demo01; ...
- sonar-scanner命令参数分析
C:\Users\huang>sonar-scanner -h INFO: INFO: usage: sonar-scanner [options] INFO: INFO: Options: I ...
- ELK实战部署
环境 : 一台 centos 6.7 IP地址: 192.168.88.250 软件版本 : ElasticSearch 2.1.0 Logstash 2.1.1 Kibana 4.3.1 ...
- JDBC 基础入门
由于我也是初学参考的是网上的或者是培训机构的资料所以可能会有错误的信息,仅供参考 一.什么是JDBC(Java Data Base Connectivity)? java程序连接数据库,JDBC是由S ...
- springBoot 基础入门
来处:是spring项目中的一个子项目 优点 (被称为搭建项目的脚手架) 减少一切xml配置,做到开箱即用,快速上手,专注于业务而非配置 从创建项目上: -- 快速创建独立运 ...
- redis小结 1-2
1.Redis 发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 下图展示了频道 c ...