【算法基础】Dijkstra 算法
定义:
- g [ i ] [ j ] g[i][j] g[i][j] 表示 v i v_i vi 到 $v_j $的边权重,如果没有连接,则 g [ i ] [ j ] = ∞ g[i][j] = \infty g[i][j]=∞
- d i s [ i ] dis[i] dis[i] 表示 v k v_k vk 到节点 v i v_i vi 的最短长度, d i s [ k ] = 0 , d i s [ i ] = ∞ , i ≠ k dis[k] = 0, dis[i]=\infty, i \neq k dis[k]=0,dis[i]=∞,i=k.
目标:
- 计算出 d i s dis dis 数组,也就是任何点到 v k v_k vk 的距离。
step1 : 更新 v k v_k vk 的所有邻居节点 v y v_y vy的最短路径; 即: d i s [ y ] = g [ k ] [ y ] dis[y] = g[k][y] dis[y]=g[k][y]
step2 : 找出 这些邻居节点中路径最短的 d i s [ i 1 ] dis[i1] dis[i1]. 此时 d i s [ i 1 ] dis[i1] dis[i1] 一定已经是最短的了,可以用反证法来证明。
step3 : 找出 v i 1 v_{i1} vi1 的邻居节点 y ′ y' y′, 如果 d i s [ i 1 ] + g [ i 1 ] [ y ′ ] < d i s [ y ′ ] dis[i1]+g[i1][y'] < dis[y'] dis[i1]+g[i1][y′]<dis[y′], 则更新 d i s [ y ′ ] = d i s [ i 1 ] + g [ i 1 ] [ y ′ ] dis[y'] =dis[i1]+g[i1][y'] dis[y′]=dis[i1]+g[i1][y′], 否则不更新。
step4 : 找出 k , i 1 k,i1 k,i1之外的 d i s [ i ] dis[i] dis[i] 最小的值 d i s [ i 2 ] dis[i2] dis[i2], 重复之前的更新过程,知道取完所有点为止。
code :
leecode 743
朴素写法:
class Solution:def networkDelayTime(self, times: List[List[int]], n: int, k: int) -> int:g = [[inf for _ in range(n)] for _ in range(n)] # 邻接矩阵for x, y, d in times:g[x - 1][y - 1] = ddis = [inf] * nans = dis[k - 1] = 0 # 起始节点done = [False] * n #是否确定为最短while True:x = -1# 找到最短的 done 是用来排除已经确定的那些点的。完成后x 记录当前最短距离的那个点。# 起始为 kfor i, ok in enumerate(done):if not ok and (x < 0 or dis[i] < dis[x]):x = i# 没有找到,也就是所有点已经全部确定后。if x < 0:return ans # 最后一次算出的最短路就是最大的# 无法到达if dis[x] == inf: # 有节点无法到达return -1# 因为每次都是递增的,而答案是要求最大的最短路径。ans = dis[x] # 求出的最短路会越来越大done[x] = True # 最短路长度已确定(无法变得更小)# 更新 x 的邻居节点的最短距离。for y, d in enumerate(g[x]):# 更新 x 的邻居的最短路dis[y] = min(dis[y], dis[x] + d)
堆优化 Dijkstra:
class Solution:def networkDelayTime(self, times: List[List[int]], n: int, k: int) -> int:g = [[] for _ in range(n)] # 邻接表for x, y, d in times:g[x - 1].append((y - 1, d))dis = [inf] * ndis[k - 1] = 0h = [(0, k - 1)] # 二元组 (dis[i], i)while h:dx, x = heappop(h) # 找到最短路径的 x 和其相应的 disif dx > dis[x]: # x 之前出堆过,continue# 这里continue 是因为 对于一个x 由于更新了多次dis, 堆中科恩那个存在多个 dx, 对于那些较大的dx, 不再使用的意思。# 更新邻居for y, d in g[x]:new_dis = dx + dif new_dis < dis[y]:dis[y] = new_dis # 更新 x 的邻居的最短路heappush(h, (new_dis, y))mx = max(dis)return mx if mx < inf else -1
相关文章:
【算法基础】Dijkstra 算法
定义: g [ i ] [ j ] g[i][j] g[i][j] 表示 v i v_i vi 到 $v_j $的边权重,如果没有连接,则 g [ i ] [ j ] ∞ g[i][j] \infty g[i][j]∞ d i s [ i ] dis[i] dis[i] 表示 v k v_k vk 到节点 v i v_i vi 的最短长度, …...
使用 Flask 3 搭建问答平台(三):注册页面模板渲染
前言 前端文件下载 链接https://pan.baidu.com/s/1Ju5hhhhy5pcUMM7VS3S5YA?pwd6666%C2%A0 知识点 1. 在路由中渲染前端页面 2. 使用 JinJa 2 模板实现前端代码复用 一、auth.py from flask import render_templatebp.route(/register, methods[GET]) def register():re…...
pycharm如何debug for循环里面的错误值
一般debug时,在for循环里面的话,需要自己一步一步点。如果循环几百次那种就比较麻烦。此时可以采用try except的方式来解决 例子如下 #ptyhon debug for循环的代码 num[1,2,3,s,4] ans0 for i in num:try:ansiexcept:print(错误) print(ans) 结果如下&a…...
解决网页中的 video 标签在移动端浏览器(如百度访问网页)视频脱离文档流播放问题
问题现象 部分浏览器视频脱离文档流,滚动时,视频是悬浮出来,在顶部播放 解决方案 添加下列属性,可解决大部分浏览器的脱离文档流的问题 <videowebkit-playsinline""playsInlinex5-playsinlinet7-video-player-t…...
.Net--CLS,CTS,CLI,BCL,FCL
1.什么是CLS? 所以.NET专门为此参考每种语言(例如C# ,VB,F#)并找出了语言间的共性,然后定义了一组规则,开发者都遵守这个规则来编码,那么代码就能被任意.NET平台支持的语言所通用。 而与其说是规则&#x…...
Stable Diffusion:质量高画风清新细节丰富的二次元大模型二次元插图
今天和大家分享一个基于Pony模型训练的二次元模型:二次元插图。关于该模型有4个不同的分支版本。 1.5版本:loar模型,推荐底模型niji-动漫二次元4.5。 xl版本:SDXL模型版本 mix版本:光影减弱,减少SDXL版本…...
数读MEME之争:以太坊获更高价值共识,抢占热点成Solana流量密码
在当前显著的加密牛市中,以太坊和Solana之间的竞争不仅在币价表现上显而易见,生态发展方面也备受关注。特别是在这轮MEME行情中,双方阵营的MEME代币呈现出不同的特点和趋势。 市场表现对比 以太坊的优势: 市场份额和认可度更高&…...
python的with语句
1.with语句的作用 在 Python 中,with 语句用于创建一个上下文管理器,以更简洁和安全的方式管理资源。 其主要优点是可以确保在代码块执行完毕后,相关资源能够被正确释放或清理,即使在代码块内部发生了异常。 以下是一个使用 with…...
Selenium原理深度解析
在自动化测试领域,Selenium无疑是最受欢迎和广泛使用的工具之一。它支持多种浏览器和操作系统,为开发人员和测试人员提供了强大的自动化测试解决方案。本文将深入探讨Selenium的工作原理,包括其架构、核心组件、执行流程以及它在自动化测试中…...
算法复杂度<数据结构 C版>
什么是算法复杂度? 简单来说算法复杂度是用来衡量一个算法的优劣的,一个程序在运行时,对运行时间和运行空间有要求,即时间复杂度和空间复杂度。 目录 什么是算法复杂度? 大O的渐近表达式 时间复杂度示例 空间复杂度…...
【XSS】
文章目录 0x01 简介0x02 XSS Payload用法XSS攻击平台及调试JavaScript 0x03 XSS绕过XSS漏洞防御策略 跨站脚本攻击,Cross Site Script。(重点在于脚本script) 有关XSS可以造成的 危害,见 0x02 XSS Payload用法 分类 反射型、存储…...
Go网络编程-RPC程序设计
gRPC 通信 RPC 介绍 RPC, Remote Procedure Call,远程过程调用。与 HTTP 一致,也是应用层协议。该协议的目标是实现:调用远程过程(方法、函数)就如调用本地方法一致。 如图所示: 说明: Servi…...
Linux 性能优化:轻松入门
文章目录 前言一、磁盘性能优化1、 磁盘 RAID 模式选择2、文件系统优化 二、优化 CPU1、性能监控 :2、进程优先级调整 :3、进程与 CPU 绑定 : 三、优化内存四、网络性能优化1、调整 TCP 缓冲区大小2、修改系统级别的文件描述符的数量3、调整 …...
C++相关概念和易错语法(22)(final、纯虚函数、继承多态难点)
1.final final在继承和多态中都可以使用,在继承中是指不想将自己被继承,在多态中是指不想该函数被重写,比较简单,下面是一些使用例子。 2.纯虚函数 当我们需要抽象一个类的时候,我们就需要用到纯虚函数。所谓抽象的类…...
状态管理的艺术:探索Flutter的Provider库
状态管理的艺术:探索Flutter的Provider库 前言 上一篇文章中,我们详细介绍了 Flutter 应用中的状态管理,以及 StatefulWidget 和 setState 的使用。 本篇我们继续介绍另一个实现状态管理的方式:Provider。 Provider优缺点 基…...
玩转HarmonyOS NEXT之IM应用首页布局
本文从目前流行的垂类市场中,选择即时通讯应用作为典型案例详细介绍HarmonyOS NEXT的各类布局在实际开发中的综合应用。即时通讯应用的核心功能为用户交互,主要包含对话聊天、通讯录,社交圈等交互功能。 应用首页 创建一个包含一列的栅格布…...
GPT-4o大语言模型优化、本地私有化部署、从0-1搭建、智能体构建
原文链接:GPT-4o大语言模型优化、本地私有化部署、从0-1搭建、智能体构建https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247608565&idx3&snd4e9d447efd82e8dd8192f7573886dab&chksmfa826912cdf5e00414e01626b52bab83a96199a6bf69cbbef7f7fe…...
记录些MySQL题集(4)
1、数据库的三范式是什么? 第一范式:列不可再分 第二范式:在第一范式的基础上,要求数据库表中的所有非主键列完全依赖于主键,而不是仅依赖于主键的一部分 第三范式:满足第二范式的基础上,所有…...
pdf提取其中一页怎么操作?提取PDF其中一页的方法
pdf提取其中一页怎么操作?需要从一个PDF文件中提取特定页码的操作通常是在处理文档时常见的需求。这种操作允许用户选择性地获取所需的信息,而不必操作整个文档。通过选择性提取页面,你可以更高效地管理和利用PDF文件的内容,无论是…...
godot使用ws
go服务端 package mainimport ("encoding/json""fmt""github.com/gorilla/websocket""net/http" )var upgrader websocket.Upgrader{ReadBufferSize: 1024,WriteBufferSize: 1024, }// 处理函数 func handleWebSocket(w http.Respo…...
Windows FFmpeg 开发环境搭建
FFmpeg 开发环境搭建 FFmpeg命令行环境搭建使用FFmpeg官方编译的库Windows编译FFmpeg1. 下载[msys2](https://www.msys2.org/#installation)2. 安装完成之后,将安装⽬录下的msys2_shell.cmd中注释掉的 rem set3. 修改pacman 镜像源并安装依赖4. 下载并编译源码 FFmpeg命令行环境…...
链路聚合概述
目录 技术背景: 基本概念: 链路聚合的工作模式: 简介: 1)Manual Load-balance(手动负载分担) 简介: 配置实施: 2)LACP(链路聚合控制协议ÿ…...
【链表】算法题(二) ----- 力扣/牛客
一、链表的回文结构 思路: 找到链表的中间节点,然后逆置链表的后半部分,再一一遍历链表的前半部分和后半部分,判断是是否为回文结构。 快慢指针找到链表的中间节点 slow指针指向的就是中间节点 逆置链表后半部分 逆置链表后半部分…...
合成复用原则
合成复用原则 (Composite Reuse Principle, CRP) 合成复用原则(Composite Reuse Principle, CRP),也被称为组合/聚合复用原则,是面向对象设计中的一条重要原则。它的核心思想是:优先使用对象组合/聚合,而不…...
安卓自带camera hal3 实例README.md翻译
最近,遇到一个这样的问题,临时了解下这个驱动实现架构和特点,翻译如下 V4L2相机HALv3 camera.v4l2库使用视频Linux 2(V4L2)接口实现了camera HAL v3。这使得它在理论上可以与各种设备配合使用,尽管V4L2的…...
ActiViz实战:ActiViz中的自己实现鼠标双击事件
文章目录 1、添加鼠标事件2、网上实现双击事件的方式3、增加双击的时间限制4、补充说明1、添加鼠标事件 已知在C#中观察者/命令模式会报错,正常添加鼠标事件如下: private void VtkInteractorStyleTest() {vtkInteractorStyle style = vtkInteractorStyle.New();style.LeftB…...
Linux-交换空间(Swap)管理
引入概念 在计算机中,硬盘的容量一般比内存大,内存(4GB 8GB 16GB 32GB 64GB…),硬盘(512GB 1T 2T…)。 冯诺依曼的现代计算机结构体系里面的存储器就是内存 内存是一种易失性存储器,…...
扫描某个网段下存活的IP:fping
前言: 之前用arp统计过某网段下的ip,但是有可能统计不全。网络管理平台又不允许登录。想要知道当前的ip占用情况,可以使用fping fping命令类似于ping,但比ping更强大。与ping需要等待某一主机连接超时或发回反馈信息不同&#x…...
【深度学习】PyTorch框架(3):优化与初始化
1.引言 在本文中,我们将探讨神经网络的优化与初始化技术。随着神经网络深度的增加,我们会遇到多种挑战。最关键的是确保网络中梯度流动的稳定性,否则可能会遭遇梯度消失或梯度爆炸的问题。因此,我们将深入探讨以下两个核心概念&a…...
Go-知识测试-子测试
Go-知识测试-子测试 1. 介绍2. 例子3. 子测试命名规则4. 选择性执行5. 子测试并发6. testing.T.Run7. testing.T.Parallel8. 子测试适用于单元测试9. 子测试适用于性能测试10. 总结10.1 启动子测试 Run10.2 启动并发测试 Parallel 建议先看:https://blog.csdn.net/a…...
网站建设代理开发科技企业服务/长沙百度搜索网站排名
首先说一下坑的地方就是python2和python3的模块改变问题,当然精通python的可以略过。这个在网上百度一下吧,第二个是导入xlsx文件的时候需要xlrd模块,而这个模块最好跟着我下面的方法走,那个python2 就可以用我下边的脚本了。 1.安…...
企业网站开发外包/可以投放广告的网站
为什么80%的码农都做不了架构师?>>> 1.批量注释 用“#”可以注释一行,想要注释整段的便捷方法可以采用“EOF”: : << COMMENTBLOCK#your shell code... COMMENTBLOCK 这个用来注释整段脚本代码。 : 是shell中的空语句。 …...
网站建设与维护考试/软文推广有哪些
原文:《BI那点儿事》Cube的存储关系 OLAP (ROLAP)ROLAP的基本数据和聚合数据均存放在关系数据库中;ROLAP 存储模式使得分区的聚合存储在关系数据库的表(在分区数据源中指定)中。但是,可为分区数据使用 ROLAP 存储模式,而不在关系数据库中创建…...
网站代建设费用吗/日本域名注册
1 //遍历服务器指定文件夹下的所有文件2 string path "uploads/Image/";3 string serverPath Server.MapPath(path);4 5 //创建临时文件夹6 string tempName DateTime.Now.ToString("yyyyMMddH…...
郑州网站建设公司 艾特/移动建站模板
办公室是企业办公的地方,对于企业而言,一个办公室的形象对于企业在团队精神、宣传展示时十分关键,对于整体实力协作、客户信赖的展示也是有一定的影响。人们在对办公空间合理、利润较大化利用的同时,如何打造一个时尚的办公空间设…...
做网站是做完给钱还是/自己如何制作网页
Regex r new Regex(".*[\\u4e00-\\u9faf].*");r.IsMatch(username)转载于:https://www.cnblogs.com/ZX-LMY/p/5535087.html...