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

HDU 5093 -- Battle ships【二分图最大匹配 && 经典建图】 Battle ships Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 898    Accepted Submission(s): 315 Problem Description Dear contestant, no 阅读详情

Battle ships HDU - 5093

题目大意:

给出一个n行m列的图,*代表海域,o代表冰水,#代表冰山,要想在海域中放置船,保证船与船之间不能相互看到,之间只要有山就不能看到,问最多能放多少船。

分析:

这道题其实是使用二分图最大匹配来做,重点就在建图上,先一行一行的看,每到一行计数x1++,如果碰到#,x1也++,这样每个*就对应了一个号,然后再一列一列到看同理,每到一列y1++,碰到#,y1++,当是\ *给它赋值当前到号。这样一个*点就有了两个值,恰好可以建二分图,然后用匈牙利算法即可
code:

#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 55
using namespace std;

int mp[maxn * 55][maxn * 55];
char str[maxn][maxn];
int used[maxn * 55];
int link[maxn * 55];
int x[maxn][maxn];
int y[maxn][maxn];
int n, m;
int x1, y1;

void init(){
    memset(mp, 0, sizeof(mp));
    memset(x, 0, sizeof(x));
    memset(y, 0, sizeof(y));
}

void input(){
    scanf("%d%d", &n, &m);
    for(int i = 0; i < n; ++i)
        scanf("%s", str[i]);
}
void creat_x(){
    x1 = 1;
    for(int i = 0; i < n; ++i){
        for(int j = 0; j < m; ++j){
            if(str[i][j] == '*')
                x[i][j] = x1;
            if(str[i][j] == '#')
                x1++;
        }
        x1++;
    }
    return ;
}

void creat_y(){
    y1 = 1;
    for(int j = 0; j < m; ++j){
        for(int i = 0; i < n; ++i){
            if(str[i][j] == '*')
                y[i][j] = y1;
            if(str[i][j] == '#')
                y1++;
        }
        y1++;
    }
    return ;
}

void getmap(){
    for(int i = 0; i < n; ++i){
        for(int j = 0; j < m; ++j)
            if(str[i][j] == '*')
            mp[x[i][j]][y[i][j]] = 1;
    }
    return ;
}

bool dfs(int x){
    for(int i = 1; i < y1; ++i){
        if(mp[x][i] && !used[i]){
            used[i] = 1;
            if(link[i] == -1 || dfs(link[i])){
                link[i] = x;
                return true;
            }
        }
    }
    return false;
}

int hungary(){
    int ans = 0;
    memset(link, -1, sizeof(link));
    for(int j = 1; j < x1; ++j){
        memset(used, 0, sizeof(used));
        if(dfs(j))
            ans++;
    }
    return ans;
}
int main (){
    int T;
    scanf("%d", &T);
    while(T--){
        init();
        input();
        creat_x();
        creat_y();
        getmap();
        int sum = hungary();
        printf("%d\n", sum);
    }
    return 0;
}
华为星闪SLE实战:手把手教你用HarmonyOS开发智能家居控制应用(附完整代码) 本文详细介绍了如何利用华为星闪SLE技术,结合HarmonyOS开发智能家居控制应用。通过对比传统无线技术,阐述了星闪SLE在低时延、高可靠性和高并发方面的优势,并提供了从环境搭建、设备发现、连接管理到核心控制代码的完整实战教程,帮助开发者快速上手这一无线短距通信技术。 阅读详情

相关推荐

基于AMD AU15P FPGA的SLVS-EC桥PCIe设计方案分享

各位FPGAer周末愉快,今天熊猫君分享一个基于AMD AU15P FPGA的SLVS-EC桥PCIe设计方案。

haoxingheng的专栏 1445

hdu 3061 Battle 最大权闭合图

Problem Description 由于小白同学近期习武十分刻苦,很快被晋升为天策军的统帅。而他上任的第一天,就面对了一场极其困难的战斗: 据侦查兵回报,前方共有N座城池,考虑到地势原因,最终得到一个结论:攻占某些城池之前必须攻占另外一些城池。 事实上,可以把地图看做是

kongming_acm的专栏 709

基于STM32的电子时钟设计

基于STM32的电子时钟设计1、设计目的2、设计具体要求3、proteus仿真图4、程序代码 1、设计目的 (1)掌握使用KEIL MDK5进行软件开发的具体流程; (2)掌握硬件电路的设计方法; (3)掌握STM32微控制器的程序设计及代码编写方法。 2、设计具体要求 (1)通过STM32自带的实时时钟功能获取时间信息; (2)在OLED显示屏上显示日期、时、分、秒等时间信息; (3)通过按键可对时间信息进行修改; (4)具有闹钟设定功能; (5)加分项:自行增加其他功能。 3、proteus仿真图 4

唯一的博客 2万+

【 HDU - 5093】Battle ships(匈牙利算法,二分图匹配)

题干: Dear contestant, now you are an excellent navy commander, who is responsible of a tough mission currently. Your fleet unfortunately encountered an enemy fleet near the South Pole where the geogr...

xuanweiace的博客 520

AD | Altium Designer(原理图设计、电路仿真、PCB绘图)汉化版

Altium Designer(原理图设计、电路仿真、PCB绘图)

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 4164

如何实现三种不同RAM?(单端口RAM、伪双端口RAM、真双端口RAM|verilog代码|Testbench|仿真结果)

RAM(随机存取存储器)是计算机系统中的一种主要存储器件,用于存储和读取数据。在RAM中,单端口RAM(Single-port RAM)和双端口RAM(Dual-port RAM)是两种常见的类型,双端口RAM又分为真双端口(True dual-port RAM)和伪双端口RAM(Simple dual-port RAM)。那么什么是单端口和双端口?又该如何区分真双端口和伪双端口?输入只有一组数据线和一组地址线,读写共用地址线,输出只有一个端口。

Loudrs的博客 1万+

hdu 5093 放置战舰 二分图匹配

http://acm.hdu.edu.cn/showproblem.php?pid=5093 给定一个MxN大小的图,有3种点,冰山、浮冰、海。现在希望能在图中放置尽可能多的船。船的四个方向上不能有其他的船,除非有冰山阻隔。 最自然的想到搜索,但是由于矩阵大小有50^2,显然会超时 其实可以将一行被冰山隔开且包含海水的连续区域叫做“块”。 把每个横向“块”看做二部图中的...

weixin_30814223的博客 166

雷电模拟器安装面具环境并过软件检测系列(看这一篇就够了!)

雷电模拟器安装面具环境并过基本软件的环境检测

qq_45059975的博客 6万+

HDU - 3061 Battle(最大权闭合子图)

题目链接 题意: 由于小白同学近期习武十分刻苦,很快被晋升为天策军的统帅。而他上任的第一天,就面对了一场极其困难的战斗:据侦查兵回报,前方共有N座城池,考虑到地势原因,最终得到一个结论:攻占某些城池之前必须攻占另外一些城池。事实上,可以把地图看做是一张拓扑图,而攻占某个城池,就意味着必须先攻占它的所有前驱结点。小白还做了一份调查,得到了攻占每个城池会对他的兵力产生多少消耗(当然...

193

Claude Code 源码一夜流出:会看热闹的人很多,会读源码的人很少

摘要:Claude Code源码意外泄露后,作者分享了高效的源码学习方法:1)Fork仓库保存代码;2)使用Qoder的Repo Wiki功能生成结构化文档和UML图;3)基于Wiki创建可复用的Skill。这种方法比直接让AI总结代码更系统深入,并推荐了可视化学习项目辅助理解。文章强调实践的重要性,提供了具体工具和操作指南。

719

如何在 UniApp 中接入讯飞语音听写功能 文末附vue3+vue2完整代码

在开发过程中,我遇到了讯飞接口返回空数据的问题。通过仔细检查传送的每一帧数据,我发现问题出在第一帧的配置信息以及 Base64 数据的切片。确保每一帧的数据正确且符合接口要求,问题就能够得到解决。希望这个过程能帮助你在项目中顺利对接讯飞语音识别。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 995

【HDU】5093Battle ships(二分图最大匹配问题)

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 2001    Accepted Submission(s): 726   Problem Description Dear contestant, now you...

红点雷龙XL 244

掌握C++新特性中智能指针的综合指南

本文是一篇关于C++中智能指针的综合指南,旨在深入探讨现代内存管理的核心概念和技术。智能指针是C++中一种强大的工具,可以帮助开发人员更安全、高效地管理内存资源。通过详细解析各种类型的智能指针,包括unique_ptr、shared_ptr和weak_ptr,读者将了解它们的原理、用法和适用场景。本文将重点介绍智能指针的优势,如自动内存释放、避免内存泄漏和循环引用等问题。此外,还将讨论智能指针与传统指针的区别,并提供一些最佳实践和实用技巧,帮助读者在实际项目中正确、高效地使用智能指针。

Lion_Long的博客 1200

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

题意:一个m行n列的图由#、*、o三种符号组成,分别代表冰山、海域、浮冰,问最多可放的炮舰数(要求满足以下条件) 1、炮舰只可放在海域处 2、两个炮舰不能放在同一行或同一列(除非中间隔着一个或多个冰山) 分析: 1、如果单纯只考虑不能放在同一行同一列,那就是行号与列号的匹配,原理与UVALive 6811 Irrigation Line(二分图最小点覆盖--匈牙利算法)相同。 ...

Cherrychan2014的博客 178

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5093 题目大意:给你 N*M 的矩阵图,

沉溺的专栏 611

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

题意: M*N的矩阵,每个格子上是三个之一:*、o、#。   (1 <= m, n <= 50) *:海洋,战船可以停在上面。 o:浮冰,战船不可以停在上面 #:冰山,战船不可以停在上面。 限制:两艘战船不能处于同一行或同一列,除非它们之间有冰山挡着。 问最多可以停多少艘战船。 思路: 和二分图最小...

weixin_30915275的博客 81

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

hdu 5093 Battle ships(二分图匹配)

题意:给一个地图,海面上可以放船,浮冰上不能

绝望的乐园 841

HDU 5093 Battle ships(二分图匹配)

该题是一道经典的二分图匹配题目 。  同一列(行)上不能放两个船除非有冰山隔着。对于这种二维平面图,我们很容易想到将行和列分成两个集合,进行二分图匹配,当一个行坐标匹配到一个列坐标时,该格子可以放置船。那么为了使任意两个船都不在同一行或者同一列,除非有冰山,我们可以将每一行中一块连续的只能放置一个船的区域都设成一个编号,同样的按照列也这样处理,这样就相当于将行和列缩点了,接下来用最大流模板套一套就

AC_Arthur的专栏 1691

hdu5093 Battle ships 二分图匹配

Description Dear contestant, now you are an excellent navy commander, who is responsible of a tough mission currently.  Your fleet unfortunately encountered an enemy fleet near the South Pole wh

thunderMrbird的博客 690

HDU 5093 Battle ships [二分图匹配] [匈牙利算法]

Battle ships Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64uDescription Dear contestant, now you are an excellent navy commander, who is responsible of a tough miss

C'est la vie. 593

hdu 5093 Battle ships(二分图匹配)

Battle ships Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 893    Accepted Submission(s): 314 Problem Description Dear contestant, no

莫道青天真无道,能逍遥时且逍遥! 1132

hdu 5093 Battle ships 二分匹配

题意:在n×m的方格中,‘#’代表iceberg,'*'代表ocean,‘o’代表floating ice。战舰只能放在ocean上,在同一行或者同一列不能放两 个战舰除非它们中间有iceberg,求最多能放多少战舰。 思路:二分匹配。每行中连续为'*'的作为X集合中一个点,同样,将每列中连续为'*'的点作为Y集合中的一个点。对原图中每个'*',将其对应的X集合和Y集合中的标号建边,便形成

AC_kereo的专栏 984

hdu 5093 Battle ships(最大流 || 二分图)

hdu 5093 Battle ships Description Dear contestant, now you are an excellent navy commander, who is responsible of a tough mission currently. Your fleet unfortunately encountered a

总有那么一群人喜欢盯着我的博客看,估计这是他们见过最长的博客名,我必须得告诉他们博客名最长可以写多长 767

Battle ships HDU - 5093二分匹配

Battle shipsHDU - 5093   题目大意:n*m的地图,*代表海洋,#代表冰山,o代表浮冰,海洋上可以放置船舰,但是每一行每一列只能有一个船舰(类似象棋的車),除非同行或者同列的船舰中间有冰山挡着,问最多能放多少个船舰?   之前做过一个放置炮的,那时数据小直接暴力加搜索就A了,然而这题暴力搜索的话,直接了当的TLE,没办法只好去学新东西了。二分图这个概念只有在之前的题目中做...

weixin_30876945的博客 69
上一篇: Seam Carving HDU - 5092(基础dp+路径还原)
下一篇: Relatively Prime Graph(贪心+注意数据范围)
Guuuuuu老师儿
博客等级 码龄9年 259粉丝 718原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值