IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> [Leetcode] 每日两题 743 1631 -day96 dijkstra算法专题 -> 正文阅读

[数据结构与算法][Leetcode] 每日两题 743 1631 -day96 dijkstra算法专题

重温 dijkstra算法

Dijkstra算法 (迪杰斯特拉算法 ,卜老师纠正过是叫戴斯特比较标准)是典型最短路径算法,用于计算一个节点到其他节点的最短路径。
类似于广度优先搜索,它的主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。

基本步骤 :

  1. 指定起点s;

  2. 定义一个数组dis表示s到每个点的距离,集合Q记录当前求出的最短路径点(距离起点)以及距离,一开始Q中只有s一个点且距离为0,而visited数组用于标记节点是否已经求出距离起点的最短距离;

  3. 找出Q的 当前求出的路径的最小值对于的节点,然后根据该节点的邻接点来更新dis以及更新Q。循环第三步 直到所有的节点都求出距离S的最短距离。

关键算法流程:

? 1. 首先构建节点的邻接表

2.优先队列用于储存当前已拓展节点构成的距离起点的距离队列  包含两个元素 (dis,node)dis表示起点到该node距离 ,将(0,s) 加入队列 

? 3.队列元素不断弹出 ,每弹出一个没求出最小值的节点(visited标识)访问该节点的邻接表

? 对于该节点 tmp 的所有邻接点,计算若 起点 先走到tmp再到其邻接点的距离是否小于当前 dis表中节点到这些邻接点的距离,若小于则更新 ,且将(更新后的距离,节点序号 )加入到优先队列中

标识该节点tmp 已经求出最小值,之后若队列弹出tmp 不对其邻接点进行拓展

循环3

743. 网络延迟时间

在这里插入图片描述

? 对应题目 采用以上描述的方法
在这里插入图片描述

class Solution:
    def networkDelayTime(self, times: List[List[int]], n: int, k: int) -> int:

        k = k-1
        dis = [9999]*n
        vis = [0]*n
        tgl = [[] for _ in range(n)]
        for  i,j,l  in times:
            tgl[i-1].append((j-1,l))
            #tgl[j-1].append((i-1,l))
        dis[k] = 0
        heap = [(0,k)]
        while heap:    
            d,tmp  =  heapq.heappop(heap)
            if vis[tmp] ==0:
                for j ,l in tgl[tmp]:
                    if dis[j]> dis[tmp]+l  and vis[j]==0:
                        dis[j] = dis[tmp]+l
                        heapq.heappush(heap,(dis[j],j))    
                vis[tmp] =1     
        res =max(dis)
        if res ==9999:
            return -1
        return res

1631. 最小体力消耗路径

在这里插入图片描述

?常规想到用队列来构建BFS算法, 逐一拓展 ,但是用dijkstra显然快很多, 对于这题就是一个二维的dijkstra ,整体代码 基本不变

、、
在这里插入图片描述

class Solution:
    def minimumEffortPath(self, heights: List[List[int]]) -> int:

        row,col = len(heights),len(heights[0])
        heap= []
        vis = [[0]*col for _ in range(row)]
        ner = [[1,0],[-1,0],[0,1],[0,-1]]
        heapq.heappush(heap,(0,0,0))
        res = 0
        
        while heap:
            dis ,i,j = heapq.heappop(heap)
            res =max(res,dis)
            if i ==row-1 and j ==col-1:
                return res 
            if vis[i][j] == 0:
                for x,y in ner:
                    newi,newj = i+x,j+y
                    if 0<=newi<row and 0<=newj<col and vis[newi][newj]==0 :
                        newdis = abs(heights[i][j]-heights[newi][newj])
                        heapq.heappush(heap,(newdis,newi,newj))  
                vis[i][j]=1


  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-28 15:50:37  更:2022-02-28 15:52:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 16:29:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码