图论(四)—最短路问题(Dijkstra)
一、最短路
概念:从某个点 A 到另一个点B的最短距离(或路径)。从点 A 到 B 可能有多条路线,多种距离,求其中最短的距离和相应路径。
最短路径分类:
单源最短路:图中的一个点到其余各点的最短路径
多源最短路:图中任意两点的最短路径
框架图解:

二、朴素Dijkstra算法
算法思想(仅限于非负权重值):从起始点开始,使用贪心的策略,通过加点的方法,每次遍历到起始点距离最近且未被访问过的邻接节点 t ,将 t 加入到集合 S 中,直到访问过所有节点。
通过 N 次循环确定 n 个点到起点的最短路距离
时间复杂度为
1.在没有确定最短路中的所有点(集合 S 以外)找出距离起点最近的点 t
2.对 t 进行标记,加入到集合中
3.用 t 更新其他点的最短路距离
集合 S :已经确定最短路的点(被访问过的点) 定义数组 :从起始点到某点 ( 3 号节点 ) 的最短距离( dis[3] ) 定义二维数组
:
表示从 节点 u 到 节点 v 的距离(区分单向与双向,双向则
) 初始化:
(以节点 1 为起始点) 若 节点 u 与 节点 v 之间没有路径,初始化为
核心代码:
for(int i=1;i<=n;i++)
{int t=-1;for(int j=1;j<=n;j++) // 在没有确定最短路中的所有点找出距离最短的那个点 t if(!s[j] && (t==-1||dis[t]>dis[j]))t=j; s[t]=true; // 代表 t 这个点已经确定最短路了for(int j=1;j<=n;j++) // 用 t 更新其他点的最短距离 dis[j] = min(dis[j],dis[t]+add[t][j]);
}
样例解释:对于下图,求出节点 A 的单源最短路






| n | 1 | 2 | 3 | 4 | 5 |
| dis | 0 | 7 | 3 | 9 | 5 |
三、堆优化dijkstra算法
在朴素dijkstra算法中,遍历点是通过for循环对所有节点判断一遍得出的,”对所有节点判断“这一操作消耗了更多的时间。
算法思想:
可以通过堆(优先队列)进行优化,堆(优先队列)存储节点和起始点到该点最短距离,堆(优先队列)按照距离自动排序,取距离最小且未被访问过的点,同通过用邻接链表(或邻接表)储存图的方法,再进行松弛操作,并将进行松弛操作的节点插入堆中。

①.初始化距离:数组dis 都初始化为 0x3f3f3f3f(无穷大),并将 1 号节点插入堆中 (dis[1]=0)
②取出堆顶的点(当前起始点到该点距离最小),判断是否被访问过,不断弹出取堆顶,直至找到未被访问的节点,再根据邻接链表(或邻接表)拓展。
③进行松弛操作,把松弛的点和距离插入到堆中。
堆优化代码:
void dij(int s)
{priority_queue< pair<int,int> > q; // 利用优先队列q.push(make_pair(0,s));memset(dis,127,sizeof(dis));dis[s]=0;while(q.size()){int u=q.top().second;q.pop();if(vis[u]==1) continue;vis[u]=1;for(int i=head[u];i;i=edge[i].next) // 链式前向星{int v=edge[i].to;int w=edge[i].w;if(dis[v]>dis[u]+w){dis[v]=dis[u]+w;q.push(make_pair(-dis[v],v)); // 将路径以负数保存,优先队列默认大根堆}}}
}
关于dijkstra算法的正确性证明,参考博文:
Dijkstra贪心算法的准确性证明_为什么这种方法求下来的路径一定是最短?试分析一下它的正确性-CSDN博客
四、dijkstra算法不能用于有负权边的图
通过上述dijkstra思想可以得出,每次松弛操作就是通过当前离起始点最近的点来更新其他点的距离,下面举例说明。

当此时通过 节点 4 更新其他节点, dijkstra 思想已经确定 dis [ 4 ] 为 起始点 到 节点 4 的最短路,显然错误。
相关文章:
图论(四)—最短路问题(Dijkstra)
一、最短路 概念:从某个点 A 到另一个点B的最短距离(或路径)。从点 A 到 B 可能有多条路线,多种距离,求其中最短的距离和相应路径。 最短路径分类: 单源最短路:图中的一个点到其余各点的最短路径…...
用友NC linkVoucher SQL注入漏洞复现
0x01 产品简介 用友NC是由用友公司开发的一套面向大型企业和集团型企业的管理软件产品系列。这一系列产品基于全球最新的互联网技术、云计算技术和移动应用技术,旨在帮助企业创新管理模式、引领商业变革。 0x02 漏洞概述 用友NC /portal/pt/yercommon/linkVoucher 接口存在…...
部署Prometheus + Grafana实现监控数据指标
1.1 Prometheus安装部署 Prometheus监控服务 主机名IP地址系统配置作用Prometheus192.168.110.27/24CentOS 7.94颗CPU 8G内存 100G硬盘Prometheus服务器grafana192.168.110.28/24CentOS 7.94颗CPU 8G内存 100G硬盘grafana服务器 监控机器 主机名IP地址系统配置k8s-master-0…...
GEE27:遥感数据可用数据源计算及条带号制作
1.写在前面 🌍✨今天读了一篇关于遥感数据可用数据源计算及条带号制作的文章,结合着自己的理解,添加了一些内容。 2.GEE代码 📚📚这段代码的主要作用是利用Google Earth Engine平台,通过分析Landsat 8影…...
FURNet问题
1. 为什么选择使用弱监督学习? 弱监督学习减少了对精确标注数据的依赖,这在医学图像处理中尤为重要,因为高质量标注数据通常需要大量专业知识和时间。弱监督学习通过利用少量标注数据或粗略标注数据来训练模型,降低了数据准备的成…...
抖音小店怎么对接达人合作?达人带货的细节分享,附邀约达人话术
大家好,我是电商花花 人有多大胆,地就有多大产,做抖店想要出单,爆单,那必须要对接大量的达人来帮我们带货,抖音小店就是直播电商,帮我们对接的达人越多,出单就越多。 所以做抖店如…...
迈向未来:Web3 技术开发的无限可能
在当今的数字时代,互联网技术日新月异,推动着各行各业的变革与发展。从Web1.0的信息发布,到Web2.0的社交互动,互联网的每一次进化都为人们的生活带来了深远的影响。如今,Web3的到来正在开启一个全新的时代,…...
Python应用开发——30天学习Streamlit Python包进行APP的构建(2)
🗓️ 天 14 Streamlit 组件s Streamlit 组件s 是第三方的 Python 模块,对 Streamlit 进行拓展 [1]. 有哪些可用的 Streamlit 组件s? 好几十个精选 Streamlit 组件s 罗列在 Streamlit 的网站上 [2]. Fanilo(一位 Streamlit 创作者)在 wiki 帖子中组织了一个很棒的 St…...
Leecode热题100---46:全排列(递归)
题目: 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 思路: 元素交换函数递归: 通过交换元素来实现全排列。即对于[x, nums.size()]中的元素,for循环遍历每个元素分别成…...
Android 多语言
0. Locale方法 Locale locale Locale.forLanguageTag("zh-Hans-CN"); 执行如下方法返回字符串如下: 方法 英文下执行 中文下执行 备注 getLanguage()zhzhgetCountry()CNCNgetDisplayLanguage()zh中文getDisplayCountry()CN中国getDisplayName()zh (…...
Thingsboard规则链:Message Type Filter节点详解
一、Message Type Filter节点概述 二、具体作用 三、使用教程 四、源码浅析 五、应用场景与案例 智能家居自动化 工业设备监控 智慧城市基础设施管理 六、结语 在物联网(IoT)领域,数据处理与自动化流程的实现是构建智能系统的关键。作…...
SQLI-labs-第二十五关和第二十五a关
目录 第二十五关 1、判断注入点 2、判断数据库 3、判断表名 4、判断字段名 5、获取数据库的数据 第二十五a关 1、判断注入点 2、判断数据库 第二十五关 知识点:绕过and、or过滤 思路: 通过分析源码和页面,我们可以知道对and和or 进…...
Windows、Linux添加路由
目录 一、Windows添加路由 1. 查看路由规则 2. 添加路由规则 3. 添加默认路由 4. 删除路由规则 二、Linux添加路由 1. 查看路由 2. 添加路由 3. 删除路由 4. 修改路由 5. 临时路由 6. 默认网关设置 一、Windows添加路由 1. 查看路由规则 route print 2. 添加…...
Swift 初学者交心:在 Array 和 Set 之间我们该如何抉择?
概述 初学 Swift 且头发茂密的小码农们在日常开发中必定会在数组(Array)和集合(Set)两种类型之间的选择中“摇摆不定”,这也是人之常情。 Array 和 Set 在某些方面“亲如兄弟”,但实际上它们之间却有着“云…...
C++ 类模板 函数模板
类模板 #include <bits/stdc.h> using namespace std; //多少变量就写多少个 template<typename T1, typename T2> class Cat { public:Cat(){}Cat(T1 name, T2 age){this->age age;this->name name;}void print(){cout << this->name << …...
OTP8脚-全自动擦鞋机WTN6020-低成本语音方案
一,产品开发背景 首先,随着人们生活质量的提升,对鞋子的保养需求也日益增加。鞋子作为人们日常穿着的重要组成部分,其清洁度和外观状态直接影响到个人形象和舒适度。因此,一种能够自动清洁和擦亮鞋子的设备应运而生&am…...
GpuMall智算云:meta-llama/llama3/Llama3-8B-Instruct-WebUI
LLaMA 模型的第三代,是 LLaMA 2 的一个更大和更强的版本。LLaMA 3 拥有 35 亿个参数,训练在更大的文本数据集上GpuMall智算云 | 省钱、好用、弹性。租GPU就上GpuMall,面向AI开发者的GPU云平台 Llama 3 的推出标志着 Meta 基于 Llama 2 架构推出了四个新…...
内存泄漏案例分享4-异步任务流内存泄漏
案例4——异步任务内存泄漏 异步任务,代指起子线程异步完成一些数据操作、网络接口请求等,通常会使用以下API: Runnbale,Thread,线程池RxJavaHandlerThread 而这些异步任务很有可能操作内存泄漏,下面我们以Rxjava为…...
【机器学习300问】100、怎么理解卷积神经网络CNN中的池化操作?
一、什么是池化? 卷积神经网络(CNN)中的池化(Pooling)操作是一种下采样技术,其目的是减少数据的空间维度(宽度和高度),同时保持最重要的特征并降低计算复杂度。池化操作不…...
RPA机器人流程自动化如何优化人力资源工作流程
人力资源部门在支持员工和改善整体工作环节方面扮演着至关重要的角色,但是在人资管理的日常工作中,充斥着大量基于规则的重复性任务,例如简历筛选、面试安排、员工数据管理、培训管理、绩效管理等,这些任务通常需要工作人员花费大…...
PyTorch 2.8模型可视化艺术:使用Visio绘制神经网络架构图
PyTorch 2.8模型可视化艺术:使用Visio绘制神经网络架构图 1. 为什么需要专业的模型可视化 在深度学习项目中,一个清晰直观的模型架构图往往比千言万语更有说服力。想象一下,当你需要向团队展示新设计的Transformer变体,或者在论…...
烟台GEO搜索优化服务商链接烟台GEO搜索优化服务商
在当今数字化时代,越来越多的商家开始重视线上推广,希望通过互联网吸引更多潜在客户。然而,在实际操作中,很多商家面临着传统广告投放广撒网、预算浪费在非目标人群等问题。如何解决这些痛点,实现高效精准的营销呢&…...
StructBERT文本相似度-中文-通用模型效果展示:电商商品描述语义聚类案例
StructBERT文本相似度-中文-通用模型效果展示:电商商品描述语义聚类案例 1. 项目概述 StructBERT中文文本相似度模型是一个基于百度深度学习技术的高精度语义理解工具,专门用于计算中文句子之间的语义相似度。这个模型能够理解中文语言的深层语义&…...
阿里达摩院神器实测:RexUniNLU开箱即用,智能客服理解力飙升
阿里达摩院神器实测:RexUniNLU开箱即用,智能客服理解力飙升 1. 开箱体验:零样本理解模型初探 1.1 一键部署的便捷性 RexUniNLU镜像的部署过程简单到令人惊讶。启动后访问7860端口,一个清爽的Web界面立即呈现在眼前。界面分为三…...
SEO宣传推广公司如何做好移动端优化
SEO宣传推广公司如何做好移动端优化 在当前数字化营销的浪潮中,移动端优化已经成为了每一个SEO宣传推广公司必须要掌握的技能之一。随着越来越多的用户通过手机浏览网站和进行在线购物,如何在移动端上获得更高的流量和转化率成为了企业竞争的关键。SEO宣…...
宇树A1电机折腾笔记
文章目录电脑SDK控制变态的硬件接线环境配置下位机直接控制上图就是笨笨的宇树A1,这是我目前为止转过的最难转的电机。电机的说明书、SDK链接都来自MATH-286-Pro的视频提供:宇树A1相关资料、宇树官方SDK仓库。这篇笔记分两部分,先使用SDK驱动…...
万象视界灵坛惊艳效果:CLIP-ViT-L/14在低分辨率图像上的鲁棒性语义解析
万象视界灵坛惊艳效果:CLIP-ViT-L/14在低分辨率图像上的鲁棒性语义解析 1. 平台概览与核心价值 万象视界灵坛是一款基于OpenAI CLIP-ViT-L/14模型构建的多模态智能感知平台。不同于传统视觉识别系统的单调界面,这个平台将复杂的语义对齐过程转化为直观…...
Qwen-Image-Edit保姆级教程:3步搭建本地修图神器,隐私安全有保障
Qwen-Image-Edit保姆级教程:3步搭建本地修图神器,隐私安全有保障 想要一款既能保护隐私又能快速修图的AI工具?今天给大家介绍基于阿里通义千问Qwen-Image-Edit模型的本地化修图方案,无需联网、数据不出本地,3步就能搭…...
Highlight.js在Vue3中的性能优化指南:按需加载 vs 全量引入
Highlight.js在Vue3中的性能优化实战:从全量引入到精准加载 当你的Vue3项目需要展示代码片段时,Highlight.js无疑是语法高亮的首选方案。但在大型应用中,直接全量引入这个强大的工具可能会让你的打包体积意外膨胀——完整的Highlight.js包含超…...
OpenClaw+千问3.5-35B-A3B-FP8:自动化技术文档翻译系统
OpenClaw千问3.5-35B-A3B-FP8:自动化技术文档翻译系统 1. 为什么需要自动化文档翻译 去年参与一个开源项目时,我遇到了多语言文档维护的困境。项目文档需要同步维护中英文版本,每次更新都要经历"写中文→翻译→调整格式→校对"的…...
