二分图最大匹配问题

遇到冰山就把行列拆成两个部分。每个部分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. IIS 中的虚拟目录 和软连接

    在WIndows 中 可以这样设置 mklink /D  C:\bb C:\cc 这样 bb 就指向 CC了 bb 在IIS中的目录其实就是虚拟目录 .这样大的文件就不用存放在IIS中了,可以放在其他 ...

  2. Segment Tree Range Minimum Query.

    int rangeMinQuery(int segTree[], int qlow, int qhigh, int low, int high, int pos) { if (qlow <= l ...

  3. TensorFlow中tf.ConfigProto()配置Sesion运算方式

    博主个人网站:https://chenzhen.online tf.configProto用于在创建Session的时候配置Session的运算方式,即使用GPU运算或CPU运算: 1. tf.Con ...

  4. Light Pre-Pass 渲染器----为多光源设计一个渲染器

    http://blog.csdn.net/xoyojank/article/details/4460953 作者: Wolfgang Engel, 原文: http://www.wolfgang-en ...

  5. cf808D(xjb)

    题目链接:http://codeforces.com/problemset/problem/808/D 题意:问能不能通过交换不超过两个元素的位置使得原数组变成能分成前,后和相等的连续两部分: 注意这 ...

  6. Node.js crypto加密模块汇总

    第一篇文章:MD5 和 SHA家族 概述:使用Node实现较为简单的Hash加密算法,本篇实际上重不在Hash加密,主要的还是为了引出crypto加密的三种方式 第二篇文章:HMAC 概述:密钥相关的 ...

  7. crm项目整理概要

    一.开发背景 由于公司人员的增多,原来通过excel表格存取方式过于繁琐,而且对于公司人员的调配和绩效考核等不能做到精确处理,所以开发crm系统,开始开发只是针对销售人员和客户,后面陆续加上一些操作, ...

  8. 小程序,用js获取当前系统时间并显示

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. Python-9-赋值进阶

    1.序列解包 同时给多个变量赋值  >>> x, y, z = 1, 2, 3 >>> print(x, y, z) 1 2 3 用这种方式还可以交换两个变量的值 ...

  10. mac mysql 编码配置

    mac mysql 编码配置 (mysql目录下没有my.cnf) 想要修改编码发现自己的/usr/local/mysql/support-files里面根本没有my.cnf 安装方式是去mysql官 ...