hdu 5093 Battle ships (二分图)
二分图最大匹配问题
遇到冰山就把行列拆成两个部分。每个部分x也好,y也好只能匹配一次
图画得比较草,将就着看

横着扫一遍,竖着扫一遍,得到编号
一个位置就对应一个(xi,yi)就是X集到Y集的一条边,
由题意,每个点只能被选择一次。所以最大匹配的边数就是答案了。
算法过程
当增广路不存在的时候,就是二分图最大匹配。(同样适用其他任意图,可以求最大流)
通常都是先贪心求一个匹配,然后开始增广。
寻找增广路的过程:
一个没有和任意边匹配的点叫做未盖点,从左集X中一个未盖点u出发寻找增广路。
从u出发,选一个非匹配边到达Y集中的v,如果v没匹配,那么就找到一条增广路(只要把之前走过的匹配边和非匹配边交换,匹配边数加一)。否则沿着v的匹配边回来,然后重复以上过程。
做这题的过程中,把数组开小了导致TLE...还加了个反向边,不过在debug过程中到是发现了不用每次都memset vis数组的小技巧
#include<cstdio>
#include<cstring> const int maxn = ;
const int maxv = ; //
const int maxe = (maxv*maxv);
char pg[maxn][maxn];
int g[maxn][maxn][]; int to[maxe],nxt[maxe],head[maxv],ecnt;
int match[maxv]; void addEdge(int u,int v)
{
to[ecnt] = v;
nxt[ecnt] = head[u];
head[u] = ecnt++;
} int vis[maxv];
int times;
//find augmenting path
bool dfs(int u)
{
for(int i = head[u]; ~i; i = nxt[i]){
int v = to[i];
if(vis[v]!= times){
vis[v] = times;
if(!~match[v] || dfs(match[v]) ){
match[v] = u;
return true;
}
} }
return false;
} int x_num,y_num; void go()
{
memset(match,-,sizeof(match));
int ans = ;
for(int i = ; i < x_num; i++ ){
times++;
if(dfs(i)) ans++;
}
printf("%d\n",ans);
} void init(){
memset(head,-,sizeof(head));
ecnt = ;
x_num = ;
}
int main()
{
//freopen("in.txt","r",stdin);
int T;
times = ;
scanf("%d",&T);
while(T--){
init();
int m,n;
scanf("%d%d",&m,&n);
for(int i = ; i < m; i++)
scanf("%s",pg[i]);
bool flag;//如果某行没有找到那么编号不应该增加
for(int i = ; i < m; i++){
flag = false;
for(int j = ; j < n; j++){
if(pg[i][j] == 'o') g[i][j][] = -;
else if(pg[i][j] == '#') g[i][j][] = -,x_num++;
else g[i][j][] = x_num,flag = true;
}
if(flag) x_num++;
} y_num = x_num;
for(int j = ; j < n; j++){
flag = false;
for(int i = ; i < m; i++){
if(pg[i][j] == 'o') ;
else if(pg[i][j] == '#') y_num++;
else g[i][j][] = y_num,flag = true;
}
if(flag) y_num++;
} for(int i = ; i < m; i++)
for(int j = ; j < n; j++){
if(~g[i][j][]){
addEdge(g[i][j][],g[i][j][]);
}
}
go();
}
return ;
}
hdu 5093 Battle ships (二分图)的更多相关文章
- HDU 5093 Battle ships(二分图最大匹配)
题意:一个m行n列的图由#.*.o三种符号组成,分别代表冰山.海域.浮冰,问最多可放的炮舰数(要求满足以下条件) 1.炮舰只可放在海域处 2.两个炮舰不能放在同一行或同一列(除非中间隔着一个或多个冰山 ...
- HDOJ 5093 Battle ships 二分图匹配
二分图匹配: 分别按行和列把图展开.hungary二分图匹配. ... 例子: 4 4 *ooo o### **#* ooo* 按行展开. .. . *ooo o#oo oo#o ooo# **#o ...
- hdu 5093 Battle ships(二分图最大匹配)
题意: M*N的矩阵,每个格子上是三个之一:*.o.#. (1 <= m, n <= 50) *:海洋,战船可以停在上面. 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 ...
- Hdu5093 Battle ships 二分图
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission( ...
- hdu 5093 放置战舰 二分图匹配
http://acm.hdu.edu.cn/showproblem.php?pid=5093 给定一个MxN大小的图,有3种点,冰山.浮冰.海.现在希望能在图中放置尽可能多的船.船的四个方向上不能有其 ...
随机推荐
- JAVA学习笔记——(四)
今日内容介绍 1.流程控制语句switch 2.数组 3.随机点名器案例 01switch语句解构 * A:switch语句解构 * a:switch只能针对某个表达式的值作出判断,从而决定程序执行哪 ...
- PHP中error_reporting()函数的用法(修改PHP屏蔽错误)
一般在默认的普通PHP文件中输出一个未定义声明的变量是不会报错误的,但在codeigniter框架下却要报错误,这对于想集成 添加 和 修改 页面于一体的”懒人”很不方便,由于是初学者开始还想怎么在代 ...
- UVa 10801 Lift Hopping (Dijkstra)
题意:有一栋100层的大楼(标号为0~99),里面有n个电梯(不超过5个),以及要到达的层数(aid),然后是每个电梯走一层所需的时间, 再n行就是对应每个电梯可以到达的层数,数量不定.然后每装换一次 ...
- java面试一定会遇到的56个面试题
1.问题:如果main方法被声明为private会怎样? 答案:能正常编译,但运行的时候会提示”main方法不是public的”. 2.问题:Java里的传引用和传值的区别是什么? 答案:传引用是指传 ...
- MATLAB---make与makefile简单介绍
1 make.makefile概述 makefile定义了一系列的规则,来规定哪些部分先编译,哪些部分后编译,写好makefile以后,只需一个make命令就可以让整个工程完全自动编译,所以简单的说, ...
- OVS数据库操作
说明 [Record]就是行对应的_uuid [if-exists]当值不存在的是否会报错而不是返回False 基本信息查询 列举数据库 # ovsdb-client list-dbs Open_vS ...
- 51nod1117【贪心】
思路:哈夫曼树~~哇塞,那么有道理. 利用堆维护:每次从堆里取两个最小加起来,然后还是最小的两个,最后只剩一根总的 #include <bits/stdc++.h> using names ...
- Codeforces631C【栈维护+瞎搞】
题意: 百度. 思路: 如果该查询的R比前面的所有都大,那么前面所有都失效. 那么我先预处理出这些有效的. 那最坏的情况不就是栈里面元素(R)很多 n,n-1,n-2,n-3,n-4而且都是相反排序的 ...
- [poj]1050 To the Max dp
Description Given a two-dimensional array of positive and negative integers, a sub-rectangle is any ...
- SpringMVC基础配置及使用
SpringMVC基础配置及使用 SpringMVC:1.SpringMVC和Spring的关系: 软件开发的三层架构: web层[表示层.表现层]---->Service层----> ...