Codeforces Round #719 (Div. 3)

比赛链接

Codeforces Round #719 (Div. 3)

G. To Go Or Not To Go?

给定一个 n×m 的网格,每个格子 (i,j) 都有一个整数参数 aij(1aij109)
aij=1 表示这个格子不能通过;否则,这个格子可以通过,若 aij>0 则表示这个格子内有一个传送 门。
现在小 想要从 (1,1) 移动到到 (n,m) ,它可以以如下两种方式移动:

  • 在任意两个相邻且参数均不为 1 的格子间移动,花费为 w
  • 在有传送门的两个格子 (i,j)(x,y) 间移动,花费为 aij+axy

求小D所需的最小花费。

输入格式

第一行输入三个整数 n,m,w(1n,m2×1031w109)
接下来 n 行,每行 m 个数,第 i 行的第 j 个数表示 aij

输出格式

输出小D的最小花费。若他无法由 (1,1)(n,m) ,输出 1

解题思路

bfs

在不考虑传送门(即将其作为空格子)的情况下,bfs求出由 (1,1) 出发到达 (i,j) 的最短距离 d1[i][j],然后由传送门的性质,假设由 (i,j) 传送到 x,y,则代价为 d1[i][j]+a[i][j]+a[x][y],要求代价越小越好,即求 d1[i][j]+a[i][j] 的最小值,更新所有到达传送门的最小代价,注意,更新的传送门坐标不能放入队列中更新其他位置的代价,不然此时不是多源bfs,而是多源dijkstra,会超时。可以发现,不会使用两次及以上的传送,因为可以直接由 d1[i][j]+a[i][j] 最小的那个位置直接传送过来,所以最多只传送一次,其他都是非传送的情况,所以再利用bfs计算出到 (i,j)(n,m) 的最短距离 d2[i][j],遍历所有非障碍格子,取最小代价即可

  • 时间复杂度:O(nm)

代码



__EOF__

本文作者acwing_zyy
本文链接https://www.cnblogs.com/zyyun/p/16311439.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   zyy2001  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示