码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 最小体力消耗路径 -- dijkstra算法应用


    1631. 最小体力消耗路径
    这道题和标准dijkstra算法的区别:
    标准dijkstra算法,判断⼀条路径是⻓还是短的标准是路径经过的权重总和,而该题是路径经过的权重最⼤值,因此权重计算的方法要转换下,来到当前点的体力消耗和从当前点到下一个邻居节点的体力消耗,取两者的最大值。

    
    class Solution:
        class State:
            def __init__(self, x, y, distFromStart):
                """
                从start节点到当前节点的距离
                :param id:
                :param distFromStart:
                """
                self.x = x
                self.y = y
                self.distFromStart = distFromStart
    
            def __lt__(self, other):
                if self.distFromStart < other.distFromStart:
                    return True
                return False
    
        def adj(self, matrix, x, y):
            m = len(matrix)
            n = len(matrix[0])
            neighbors = []
            # 定义上下左右四个行走方向
            # 四个方向的顺序无关紧要
            directs = [(0, 1), (0, -1), (1, 0), (-1, 0)]
            for dir in directs:
                nx = x + dir[0]
                ny = y + dir[1]
                # 越界
                if nx < 0 or nx >= m or ny < 0 or ny >= n:
                    continue
                neighbors.append([nx, ny])
    
            return neighbors
    
        def minimumEffortPath(self, heights: List[List[int]]) -> int:
            m = len(heights)
            n = len(heights[0])
            # dp table,distTo[i]可理解为节点s到节点i的最短路劲,后续要不停地更新该表
            effortTo = [[float('inf') for _ in range(n)] for _ in range(m)]
            # base case
            effortTo[0][0] = 0
    
            min_heap = []
            # 从起点s开始BFS
            heapq.heappush(min_heap, self.State(0, 0, 0))
    
            while min_heap:
                curState = heapq.heappop(min_heap)
                curNode_x = curState.x
                curNode_y = curState.y
                curDistFromStart = curState.distFromStart
    
                # 如果只关心start 节点到某一个终点end的最短距离,此处加入一个判断即可
                if curNode_x == m-1 and curNode_y == n-1:
                    return curDistFromStart
    
                if curDistFromStart > effortTo[curNode_x][curNode_y]:
                    # 已经有一条更短的路径到达curNode节点了
                    continue
    
                # 遍历curNodeID的相邻节点
                for neighbor in self.adj(heights, curNode_x, curNode_y):
                    next_x = neighbor[0]
                    next_y = neighbor[1]
    
                    #  计算从 (curX, curY) 达到 (nextX, nextY) 的消耗
                    effortToNextNode = max(effortTo[curNode_x][curNode_y],
                                           abs(heights[curNode_x][curNode_y] - heights[next_x][next_y]))
    
                    if effortToNextNode < effortTo[next_x][next_y]:
                        # 更新dp table
                        effortTo[next_x][next_y] = effortToNextNode
                        # 将该邻居节点加入优先级队列
                        heapq.heappush(min_heap, self.State(next_x, next_y, effortToNextNode))
    
            return -1
            
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
  • 相关阅读:
    Java架构该如何进阶?还在东拼西凑的学习?这份进阶指南相信会对你有所帮助,十多位资深大佬独家秘籍一并传授!
    TensorFlow入门(九、张量及操作函数介绍)
    平时健身买什么耳机好、分享五款最好的运动耳机推荐
    ELK:开源搜索与分析技术栈(1)
    JMU软件20Linux考试复习
    (五)Gluster 管理员(小节-1)
    入门JavaWeb之 Response 下载文件
    数据治理市场:亿信华辰朝左,华傲数据向右
    ICLR 21: SSGC SIMPLE SPECTRAL GRAPH CONVOLUTION
    【Android】-- 如何使用按钮和图片(点击事件、长按点击、同时展示文本和图像、ImageView)
  • 原文地址:https://blog.csdn.net/qq_32275289/article/details/132738756
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号