二分图最大匹配问题

遇到冰山就把行列拆成两个部分。每个部分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 (二分图)的更多相关文章

  1. HDU 5093 Battle ships(二分图最大匹配)

    题意:一个m行n列的图由#.*.o三种符号组成,分别代表冰山.海域.浮冰,问最多可放的炮舰数(要求满足以下条件) 1.炮舰只可放在海域处 2.两个炮舰不能放在同一行或同一列(除非中间隔着一个或多个冰山 ...

  2. HDOJ 5093 Battle ships 二分图匹配

    二分图匹配: 分别按行和列把图展开.hungary二分图匹配. ... 例子: 4 4 *ooo o### **#* ooo* 按行展开. .. . *ooo o#oo oo#o ooo# **#o ...

  3. hdu 5093 Battle ships(二分图最大匹配)

    题意: M*N的矩阵,每个格子上是三个之一:*.o.#.                     (1 <= m, n <= 50) *:海洋,战船可以停在上面.      o:浮冰,战船 ...

  4. hdu 5093 Battle ships

    二分图匹配 #include<cstdio> #include<cstring> #include<iostream> #include<cmath> ...

  5. hdu 5093 Battle ships 匈牙利 很巧妙的建图思路

    //这题逼我把匈牙利学了 之前一直很勤快敲网络流 而且不以为耻反以为荣 解:首先按行扫描编号,如果在同一块中(即可以相互攻击),那么将其标为相同的数组,对列也做同样的操作. 然后扫描整张图,如果行编号 ...

  6. hdoj 5093 Battle ships 【二分图最大匹配】

    题目:pid=5093" target="_blank">hdoj 5093 Battle ships 题意:给你一个n*m的图,图中有冰山 '# ',浮冰 'o' ...

  7. Battle ships(二分图,建图,好题)

    Battle ships Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Tot ...

  8. Hdu5093 Battle ships 二分图

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission( ...

  9. hdu 5093 放置战舰 二分图匹配

    http://acm.hdu.edu.cn/showproblem.php?pid=5093 给定一个MxN大小的图,有3种点,冰山.浮冰.海.现在希望能在图中放置尽可能多的船.船的四个方向上不能有其 ...

随机推荐

  1. Spring入门第十六课

    接上一次讲课 先看代码: package logan.spring.study.annotation.repository; public interface UserRepository { voi ...

  2. 有两种分别用<bgsound>和<embed></embed>标签,当用<embed>插入背景音乐时可以设置宽度和高度为0,隐藏播放器。

     <bgsound>: <bgsound> 是用来插入背景音乐,但只适用于 ie,其参数设定不多.如下 <bgsound src="your.mid" ...

  3. malloc,alloc,realloc之间的相似与区别

    三个函数的申明分别是: void* realloc(void* ptr, unsigned newsize); void* malloc(unsigned size); void* calloc(si ...

  4. 数组,for语句(补10.11)

    1.数组定义:一系列通数据类型的数据集合. 2.数组赋值的两种方法: 先定义后赋值:(赋值从0开始) var aa = new Arrey(); aa[0] = 1; aa[1] = 2; 定义并赋值 ...

  5. Glassfish DeploymentException: Error in linking security policy for

    http://stackoverflow.com/questions/7322476/glassfish-deploymentexception-error-in-linking-security-p ...

  6. cmd 中粘贴复制(转)

    1 如右图,右键命令提示符窗口的标题栏,选择属性. 2 选择“编辑选项”里的“快速编辑模式”,并确定之: 3 在弹出的应用选择提示框上选择“保存属性,供以后具有相同标题的窗口使用”: 4 如此你就可以 ...

  7. MySQL事务学习

  8. easyui的datagrid用js插入数据等编辑功能的实现

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. Net Core下通过Proxy 模式

    Net Core下通过Proxy 模式 NET Core下的WCF客户端也是开源的,这次发布.NET Core 2.0,同时也发布了 WCF for .NET Core 2.0.0, 本文介绍在.NE ...

  10. java中存储金额

    很早之前, 记得一次面试, 面试官问存储金钱用什么数据类型? 当时只知道8种数据类型(boolean, byte, short, int, long, float, double, char)的我, ...