二分图最大匹配问题

遇到冰山就把行列拆成两个部分。每个部分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. JEECMS-新闻内容中遍历批量上传的图片

    [#list content.pictures as p] <li value="${p_index+1}"> <img src="${p.imgPat ...

  2. es6 reduce的用法

    一.forEach回调函数参数,item(数组元素).index(序列).arr(数组本身)循环数组,无返回值,不改变原数组不支持return操作输出,return只用于控制循环是否跳出当前循环 二. ...

  3. ue4 动画相关方法杂记

    加载资源文件中的 骨骼,动画,蒙太奇----------------------------------------- FName anis("/Game/FirstPerson/Anima ...

  4. [软件工程基础]Alpha 阶段事后分析

    设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 帮助选修物理实验的学生撰写实验报告,计算实验数据,验证计算结果,并提供一个讨论的平台. 全体成员认 ...

  5. Educational Codeforces Round 65 (Rated for Div. 2) D. Bicolored RBS

    链接:https://codeforces.com/contest/1167/problem/D 题意: A string is called bracket sequence if it does ...

  6. ICPC-无限路之城(数学+思维)

    链接:https://ac.nowcoder.com/acm/contest/321/C 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言2621 ...

  7. 寒假作业第二组E题题解

    注意看题,注意看题,注意看题.重要的事情三遍感觉都不够.不怕大家笑话,这道题RuntimeError 9次,我一直以为是哪里越界了,结果最后发现的时候,真是无语了,题目里说了,所有的integer都不 ...

  8. eclipse plugin

    快速查看目录 org.sf.easyexplore_1.0.4.jar mongo DB net.jumperz.app.MMonjaDB_1.0.16.jar jasper report jaspe ...

  9. StatusCodePagesMiddleware中间件如何针对响应码呈现错误页面

    StatusCodePagesMiddleware中间件如何针对响应码呈现错误页面 StatusCodePagesMiddleware中间件与ExceptionHandlerMiddleware中间件 ...

  10. SpringBoot---Web开发---WebSocket

    [广播式] 1. <?xml version="1.0" encoding="UTF-8"?> <project xmlns="ht ...