二分图最大匹配问题

遇到冰山就把行列拆成两个部分。每个部分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. VMware S/4 HANA OP 1511虚拟机下载,64G内存限制解决方案

    http://www.itpub.net/thread-2057212-1-1.html S4 HANA OP 1511 Scale Out

  2. NativeScript官方书籍:1.为什么选择nativescript

    1.为什么选择nativescript 本章介绍 什么是NativeScript nativescript对于移动开发世界意味着什么 NativeScript工作原理 在早期的移动应用程序(前iPho ...

  3. asp.net清空页面上的所有TextBox

    Asp.net中一次性清空页面上的所有TextBox中的内容,由于TextBox在客户端以<input type=”text”>形式来呈现的,因此解决方案有客户端和服务器端两种方式,服务器 ...

  4. 洛谷 - P1063 - 能量项链 - 区间dp

    https://www.luogu.org/problemnew/show/P1063 这个并不是每次只能从两边扩展的,可以从中间断开. #include<bits/stdc++.h> u ...

  5. HDU 1506【单调栈】

    思路: 转化成对于某一位置为最小值求向两边最远>=他的位置,用单调栈就能轻易完成. 那么ans=(left+right)*h[i]; 维护单调递增还是递减呢? 我们能很快反应到,一旦碰到一个比他 ...

  6. unite2017《Unity企业级支持案例与分析》

    在今天举办的Unite2017开发者大会上,Unity大中华区技术支持总监张黎明以"Unity企业级支持案例与分析"为主题进行了分享. 以下为演讲实录: 张黎明:非常感谢大家来参加 ...

  7. 2014-10-4 NOIP模拟赛

    1.某种密码(password.*) 关于某种密码有如下描述:某种密码的原文A是由N个数字组成,而密文B是一个长度为N的01数串,原文和密文的关联在于一个钥匙码KEY.若KEY=∑▒[Ai*Bi],则 ...

  8. Python学习笔记(数据处理)

    处理文件中数据 (统计分数) 看一下我们的文档里的数据: #-- scores.txt 刘备 23 35 44 47 51 关羽 60 77 68 张飞 97 99 89 91 诸葛亮 100 1.先 ...

  9. 人民网慕课联手FISCO BCOS开源社区上线“区块链学院”

    FISCO BCOS是完全开源的联盟区块链底层技术平台,由金融区块链合作联盟(深圳)(简称金链盟)成立开源工作组通力打造.开源工作组成员包括博彦科技.华为.深证通.神州数码.四方精创.腾讯.微众银行. ...

  10. java基础第六篇之常用思想、封装、继承和多态

    a.累加求和思想:求1~100的和,求数组/集合中元素的和,求偶数的数,求总分 int sum=0//循环外部定义sum变量,循环里面对每个元素累加 for (; ; ) { //sum+=数据 } ...