2018年全国多校算法寒假训练营练习比赛(第四场) D.小明的挖矿之旅(图论,图连通)

本文介绍了一款挖矿游戏的算法解决思路。游戏目标是在任意起始位置通过使用最少的传送门收集所有金子。文章提供了如何确定传送门放置位置的方法,并通过转化问题为有向图来寻找解决方案。

思路来源:https://blog.csdn.net/riba2534/article/details/79319597

题目描述

这个挖矿游戏会给出一个n*m个格子的地图,每个格子都有黄金。在游戏开始时小明会随机出现在地图的某一个格子当中。小明可以将他所在的格子的黄金收归囊中,并且还可以向下或者向右移动,然后继续收集黄金。地图上某些格子是障碍物,小明不能移动到有障碍物的格子上。不过,在游戏开始时,小明可以随意地在地图上放置传送门。传送门可以传送到地图上某一个确定的格子,传送门放置的位置和该传送门传送的位置在游戏开始之前必须放置和设置好传送地点。小明有无数个传送门可以使用,但是每次使用传送门所需要的游戏币也是很多的。小明想要至少要使用多少个传送门才能让他在游戏时无论出现在哪个格子,他都能拿到地图上的所有金子。

输入描述:

有多组测试数据。 对于每一组数据: 第一行输入两个整数n和m(0

输出描述:

输出一行。此行包括一个整数,表示小明所需传送门数量的最小值。

输入

3 3
...
.#.
...
  • 1
  • 2
  • 3
  • 4
  • 5

输出

1
  • 1
  • 2

思路

首先题意很明确,有一个1000*1000迷宫,里面有墙和空地,每块空地上都有金子。开始时你会被放在地图的任意空地,之后你只可以往右走或者往下走,边走可以边把路过的金子收入囊中。游戏开始时允许你在地图的一些格子放一些传送门,对于每一个传送门,你也要规定一个传送的位置,当你在游戏开始之后到达某个传送门,可以传送到该传送门的指定位置。问你一开始最少放置多少个传送门可以保证无论开局时你的位置在哪里,都可以把所有金子拿走。

我们只需要把传送门安放在无路可走的位置(出度为0),传送的位置只需要选择没有前驱(入度为0)的位置,所以我们要的答案就是找出出度为0和入度为0的点数量的最大值,特判空地小于等于1的情况(和给了一个有向图,问需要加多少条边使这个图强连通类似)

 

 

心得

通过该题,学会一个gold=1的特判(如果只有一块有金子,那么开局一定会出现在这里)

此外,如果只能向右或向下走,该图可以转化为一个有向图,我们只需让起点和终点连到一起(在终点处添加连向所有入度的传送门即可),即问题转化为连边使该图成为一个连通图。

更一般情况,若图由几个子图组成,如:

①两个入点A、B,一个出点C

②一个入点D,一个出点E

③……

我们只需保证,从任何一个图的任意一个点出发,都能到达其他任意一个图的入点即可。

这样把第i个子图的出点都连到第i+1个子图的入点上即可,答案应该是入点个数和出点个数的较大值

/*注意到这题中子图出点是一个,比较特殊*/

 

注意到如果样例为

2 2

#*

**

时,不同AC程序对应不同结果,估计是测试数据不够强所致。

//有的程序答案设置为入点个数的值,有的设置为出点个数,大概因为样例入点=出点吧

【重要提示】本资源设置为0积分下载,若非0积分请勿轻易下载 亲爱的CSDN用户: 首先感谢你点进这个资源页面。我需要提前说明一个重要情况: 本资源原本已设置为“0积分下载”,即作者希望完全免费共享。但CSDN平台有时会根据文件的下载热度、文件大小、用户权限等因素,自动将部分资源的积分调整为非0数值(如1积分、2积分、5积分等)。这是平台系统的自动行为,而非作者本人的设定。 因此,如果你当前看到该资源的下载所需积分不是0(例如显示为123……),请谨慎决定是否下载。 如果你按照非0积分支付并下载后发现资源内容不符合预期、链接失效,或者实际上该资源本应是免费的,作者无法为此承担积分损失或退还操作。强烈建议:仅在页面显示为0积分时进行下载。 另外,本资源描述中并未直接提供具体的下载地址或外部链接,因为它本身是一个通过CSDN官方上传通道提交的文件/内容包。如果你看到描述中没有外部网盘地址,这是正常的——资源文件应通过CSDN内置的“下载”按钮获取。若因平台积分显示异常导致你支付了积分,请优先联系CSDN客服咨询积分退还政策,作者没有权限修改平台自动设定的积分值。 感谢你的理解与支持。技术分享本应开放,但受限于平台规则,特此提醒如上。祝学习进步!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值