矩阵中的最短路问题

题目大意:给定一个m * n的矩阵,每个点都有对应意义的权值,求从起点到终点的最短距离(权值路径)。

以2290题为例,给定m * n的矩阵grid,每个单元格可能有两个值:0表示无障碍物,1表示有障碍物,可以上下左右移动,求从(0,0)到(m – 1, n – 1)需要移除障碍物的最小数目。

我们可以把矩阵中的每个点看作图结构中的某个结点,从该结点到相邻结点需要移除障碍物的个数为边的权值,这样求出从起点到终点的最短路即为所求答案。

解法一:Dijkstra算法

根据Dijkstra的思想,①每次从未标记的结点中选取距离出发点最近的结点,标记并加入最优集合中,②计算刚加入的点A到其相邻结点B的距离,如果dis[A] + grid[A —B] < dis[B],则更新dis[B]。

上述算法的时间复杂度为O(V^2 + E),V代表结点集大小,即m * n,E代表边集大小,可用优先队列进行优化:

使用优先队列存储结点以及起点到该结点的最短路长度,即可每次从结点中选取出离出发点最近的结点,若该结点被标记过,删除该结点并重新选取。此时复杂度为O((V + E) * logV)。

Java代码如下:

解法二:0-1 BFS

BFS也能解决上述的最短路问题,即从起点逐层遍历,直到遍历到最终结点。但BFS成功的前提是,所有边的权值均为1,然而当前出现了边的权值为0的情况,此时需要对算法进行修改,使得保证每次遍历时,当前结点到起点的距离大于等于上一次遍历的结点到起点的距离,即保证BFS逐层扩散的正确性。

修改方法:使用双端队列。如果当前结点到某相邻结点的距离为0,则加入队首,否则加入队尾。这样就保证了每次选取的结点必定为当前距离起点最近的结点,因为每次都是从队首取的。

Golang代码:

Original: https://www.cnblogs.com/ThXin/p/16339150.html
Author: 夜满星河
Title: 矩阵中的最短路问题

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/608651/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Redis学习

    Redis 因为没有指定配置文件 需配置 redis-server redis.windows.conf 之后自动启动 测试性能 redis-benchmark -p 6379 -…

    Java 2023年6月8日
    088
  • Liunx(CentOS)安装Nacos(单机启动,绑定Mysql)

    Liunx安装Nacos(单机启动,绑定Mysql) 一,准备安装包 github下载点 二,在/usr/local/目录下创建一个文件夹用于上传和解压Nacos cd /usr/…

    Java 2023年6月15日
    076
  • Qt QThread线程的简单使用

    一、概述 案例:在GUI编程中一般把耗时任务放入单独的线程中执行,用以防止主线程卡死,导致页面播放不流畅等问题。下面就简单说下在Qt中使用其自带的QThread来实现一个线程 实现…

    Java 2023年5月30日
    093
  • jvm造轮子

    博客内容来源于 刘欣老师的课程,刘欣老师的公众号 码农翻身 博客内容来源于 Java虚拟机规范(JavaSE7) 博客内容的源码 https://gitee.com/zumengj…

    Java 2023年6月8日
    0117
  • Android APP升级时解析程序包时出现问题

    一个新的测试机在自动下载升级安装更新版本APP时,报出”解析程序包时出现问题”错误。原因众说纷纭, 一番搜索,下面的回答比较全面: 简单总结: 安卓7以下一…

    Java 2023年6月15日
    0102
  • 一个人成为废物得九大特质

    成为废物的九大特质 决定事情犹豫不决,优柔寡断 很强得拖延症 做什么事都三分钟热度 害怕被拒绝 自我设限(百度一下,你就知道) 经常逃避现实,不敢面对现实 总是能找到各种借口 总是…

    Java 2023年6月7日
    091
  • 全文本搜索神器

    作为一个比较懒惰的人,文件经常放的找不到位置,整理后,又会由于层次太多,一层层打开文件夹,特别麻烦,对于文件搜索的问题,以前推荐过工具 Listary,可以非常好的解决这个问题。 …

    Java 2023年5月30日
    089
  • rocketmq TIMEOUT_CLEAN_QUEUE异常

    com.alibaba.rocketmq.client.exception.MQBrokerException: delayLevel=null, sendResult=null,…

    Java 2023年5月30日
    081
  • SQL的一种写法,匹配就更新,否则就是插入

    语法:(using里面可以是查询语句,也可以是dao层传入来的对象,集合) 例子 (mybatis写法,dao层传入来的集合对象) 解析: Original: https://ww…

    Java 2023年6月9日
    083
  • Elasticsearch的cmd窗口乱码问题(windows)

    elasticsearch 7.6.0 windows版日志乱码问题解决 修改jvm.options,如何重启es即可 新增 -Dfile.encoding=GBK Origina…

    Java 2023年6月16日
    073
  • Java学习-第一部分-第二阶段-项目实战:坦克大战【2】

    坦克大战【2】 笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 线程-应用到坦克大战 坦克大战0.3版 陆游曾说…

    Java 2023年6月15日
    092
  • JAVA规则引擎JSR-94笔札

    JSR-94 是由JCP(Java Community Process)组织所制定的java规则引擎API的java请求规范。它主要定义了规则引擎在java运行时的一些API,指导…

    Java 2023年6月15日
    076
  • Spring 调用ORACLE存储过程的结果集

    http://blog.csdn.net/sunsnow8/archive/2005/01/10/246588.aspx oracle 对于高级特性总是与众不同(我极力讨厌这一点,…

    Java 2023年5月30日
    080
  • JeeSite 快速开发平台、平台简介、发展史、优势、必读

    1、平台简介 JeeSite 快速开发平台,不仅仅是一个后台开发框架,它是一个企业级快速开发解决方案,后端基于经典组合 Spring Boot、Shiro、MyBatis,前端采用…

    Java 2023年6月7日
    078
  • 如何定义超大二维数组

    #include #include #include using namespace std; int main() { //定义超大二维数组方法一 int *p=new int[…

    Java 2023年6月7日
    090
  • mybatis(CRUD)

    3、mybatis(CRUD) 有了mybatis,我们要对数据库进行增删改查只需要操作接口和mapper.xml文件,然后进行测试就可以了。 实例代码如下: public int…

    Java 2023年6月13日
    071
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球