当前位置: 首页 > news >正文

【图论】迪杰特斯拉算法

文章目录

  • 迪杰特斯拉算法
    • 主要特点
    • 基本思想
    • 算法步骤
    • 示例
  • 实现迪杰斯特拉算法
    • 基本步骤
    • 算法思路
  • 总结

在这里插入图片描述

迪杰特斯拉算法

迪杰特斯拉算法是由荷兰计算机科学家艾兹赫尔·迪杰特斯拉(Edsger W. Dijkstra)在1956年提出的,用于解决单源最短路径问题的经典算法。该算法的目标是从一个起始顶点找到到图中其他顶点的最短路径。

主要特点

  • 适用于带权图,其中权重为非负数。(为什么只适用于非负数,因为迪杰斯特拉的思想是贪心测量,当有负权引入的时候,贪心策略将不再适用)
  • 解决从单个源点到其他所有顶点的最短路径问题。
  • 时间复杂度:当使用优先队列(例如堆)时,复杂度为 O ( E log ⁡ V ) O(E \log V) O(ElogV),其中 V V V 为顶点数量, E E E 为边的数量。

基本思想

Dijkstra算法通过不断探索距离最近的顶点,逐步扩展其最短路径的已知范围,直到找到从源点到所有其他顶点的最短路径。该算法基于贪心策略:每一步选择尚未处理的、距离源点最近的顶点进行扩展。

算法步骤

  1. 初始化

    • 将起始顶点的距离设为0,其余所有顶点的距离设为∞(表示不可达)。
    • 使用一个优先队列(或最小堆)来存储顶点及其当前的最短距离。
  2. 取距离源点最近的顶点,并标记为已处理。

  3. 对于该顶点的每个邻接顶点,更新其最短距离(如果通过当前顶点可以获得更短的路径,则更新距离)。

  4. 重复步骤2和3,直到所有顶点都被处理过,或优先队列为空。

示例

在这里插入图片描述

实现迪杰斯特拉算法

基本步骤

首先假设我们有如下的一个图:
在这里插入图片描述
灰色的点代表起点,我们需要从起点开始算每个点到起点的最短路径。
第一步按照迪杰斯特拉的表述应该将起点到起点的最短路径初始化为0,起点到另外其他点的距离初始化为正无穷。
在这里插入图片描述
这里我们更新完s点之后,应该更新和s点相连的点的最短路径了,由于之前s到t点和到y点的最短路径是正无穷,由于st和sy都小于两个最短路径,所以更新两个最短路径。
在这里插入图片描述
根据贪心策略,更新出来的两个最短路径,sy更小,所以我们应该更新y相连的路径。
在这里插入图片描述
所以接下来我们应该更新y连接的点的最短路径。
在这里插入图片描述
由于原本s到t的最短路径是10,但是现在的最短路径更新了之后是8,所以更新结果,由于之前s到x的最短路径是正无穷,所以现在将最短路径更新为14,s到z 也是相同的,因为之前的最短路径是正无穷,所以现在将最短路径更新为7.
在这三条最短路径中选择最短的那条:
在这里插入图片描述
这里就应该以z为新的起点
在这里插入图片描述
更新z连接的顶点,z一共有两条边,一条是zs,一条是zx,由于s到s是最近的0,所以这里不需要更新,由于之前s到x的距离是14,所以这里更新s到x的距离。
接下来再从剩下的边中,选择最小的路径。
在这里插入图片描述
从t点开始只有一条路径,所以这里t到x,tx是1,由于之前的st的最短路径是8,所以此时的最短路径是9,9<13所以这里应该更新最短路径为9
在这里插入图片描述
这里最短路径算是更新完了。

算法思路

由于这里我们涉及到最短路径,所以应该开辟一个dist数组,我们来想一想一个dist数组是否能解决问题,很显然是不能的,我们还需要一个数组,记录当前最短路径的前一个顶点的下标,在遍历的时候我们可以索引每一个顶点了。
代码展示:

void Dijkstra(const V& src, vector<W>& dist, vector<int>& pPath)
{//获取起点的下标size_t srci = GetVertexIndex(src);//确定节点的数量size_t n = _vertexs.size();dist.resize(n, MAX_W);pPath.resize(n, MAX_W);//自己到自己的距离是0dist[srci] = 0;//自己的前一个是自己pPath[srci] = srci;//已经确定最短路径的顶点的集合vector<bool> S(n, false);for(size_t j=0;j<n;j++){//选择最短路径顶点且不在s中更新其他路径int u = 0;     //最小的那个点W min = MAX_W; //最小权值for (size_t i = 0;i < n;i++){if (S[i] == false && dist[i] < min){//选出最小的点u = i;//更新最小权值min = dist[i];}}//u被选出来S[u] = true;//松弛更新u连接出去的顶点v    srci->u   u->vfor (size_t v = 0;v < n;v++){//确定u连接出去的所有边if (S[v] == false && _matrix[u][v] != MAX_W && (dist[u] + _matrix[u][v]) < dist[v]){dist[v] = dist[u] + _matrix[u][v];//将v的父亲更新为upPath[v] = u;}}}
}

打印路径节点和最短路径:

//打印最短路径
void PrinrtShotPath(const V& src, vector<W>& dist, vector<int>& pPath)
{//获取起点的下标size_t srci = GetVertexIndex(src);//确定节点的数量size_t n = _vertexs.size();for (size_t i = 0;i < n;i++){if (i != srci){// 先找出i顶点的路径vector<int> path;size_t parenti = i;//先将自己存进去(自己不是原点先push进去)while (parenti != srci){path.push_back(parenti);parenti = pPath[parenti];}path.push_back(srci);//将路径逆置reverse(path.begin(), path.end());//打印出路径for (auto e : path){cout << _vertexs[e] << "->";}//打印最短路径cout << dist[i];cout << endl;}}
}

因为根据最后一个节点去推上一个节点,推完之后数组中的节点会是一个反着的路径,所以在打印的时候,应该先把数组逆置,逆置之后再进行打印。

总结

在本文中,我们深入探讨了迪杰斯特拉算法的原理与应用。作为一种经典的最短路径算法,迪杰斯特拉算法通过优先队列有效地解决了从单一源点到其他所有节点的最短路径问题。我们分析了其时间复杂度和空间复杂度,了解了在不同图形结构下的性能表现。

通过示例和实现,我们不仅掌握了算法的基本步骤,还体验了其在实际应用中的重要性。无论是在交通导航、网络路由还是各种优化问题中,迪杰斯特拉算法都发挥着不可或缺的作用。

希望本文能够帮助你更好地理解迪杰斯特拉算法,并为你在图论和算法领域的进一步学习打下坚实的基础。如果你有任何疑问或想法,欢迎在评论区与我交流!

相关文章:

【图论】迪杰特斯拉算法

文章目录 迪杰特斯拉算法主要特点基本思想算法步骤示例 实现迪杰斯特拉算法基本步骤算法思路 总结 迪杰特斯拉算法 迪杰特斯拉算法是由荷兰计算机科学家艾兹赫尔迪杰特斯拉&#xff08;Edsger W. Dijkstra&#xff09;在1956年提出的&#xff0c;用于解决单源最短路径问题的经…...

四、Python基础语法(数据类型转换)

数据类型转换就是将一种类型的数据转换为另外一种类型的数据&#xff0c;数据类型转换不会改变原数据&#xff0c;是产生一个新的数据。 变量 要转换为的类型(原数据) -> num int(28) 一.int()将其他类型转换为整型 1.整数类型的字符串转换为整型 num1 28 print(type…...

工业物联网的安全与隐私保护—SunIOT

【大家好&#xff0c;我是唐Sun&#xff0c;唐Sun的唐&#xff0c;唐Sun的Sun。一站式数智工厂解决方案服务商】 在当今数字化的时代&#xff0c;工业物联网&#xff08;IIoT&#xff09;正以前所未有的速度改变着工业生产的模式和效率。然而&#xff0c;随着工业物联网的广泛…...

二层网络和三层网络的理解与区别(包含通俗理解和归纳总结)

二层网络和三层网络是计算机网络中的两个不同层次&#xff0c;主要区别在于它们所处的OSI参考模型中的层次及其功能。 二层网络 (Layer 2 Network) 1.定义&#xff1a; 二层网络主要涉及数据链路层&#xff08;Layer 2&#xff09;&#xff0c;这是OSI模型中的第二层。 它负…...

【C++】:lambda表达式的高级应用

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 引言 今天 我们来见见lambda表达式的高级用法 用法1&#xff1a;自定义删除器 有些类型的delete方法并不符合自身的析构方法&#xff0c;这时我们就需要自定义删除器。 unique_ptr<FILE> ptr1(fopen…...

详解正确创建好SpringBoot项目后但是找不到Maven的问题

目录 问题 解决步骤&#xff1a; 找到File->Project Structure... 设置SDK 设置SDKs 问题 刚刚在使用IDEA专业版创建好SpringBoot项目后&#xff0c;发现上方导航栏的运行按钮是灰色的&#xff0c;而且左侧导航栏的pom.xml的图标颜色也不是正常的&#xff0c;与此同时我…...

力扣203.移除链表元素

题目链接&#xff1a;203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6…...

UE4 材质学习笔记05(凹凸偏移和视差映射/扭曲着色器)

一.凹凸偏移和视差映射 1.偏移映射 这需要一个高度图并且它的分辨率很低&#xff0c;只有256*256&#xff0c;事实上&#xff0c;如果高度图的分辨率比较低并且有点模糊&#xff0c;效果反而会更好 然后将高度图输出到BumpOffset节点的height插槽中&#xff0c; 之后利用得到…...

网约班车升级手机端退票

背景 作为老古董程序员&#xff0c;不&#xff0c;应该叫互联网人员&#xff0c;因为我现在做的所有的事情&#xff0c;都是处于爱好&#xff0c;更多的时间是在和各行各业的朋友聊市场&#xff0c;聊需求&#xff0c;聊怎么通过IT互联网 改变实体行业的现状&#xff0c;准确的…...

【Vue】Vue 快速教程

Vue tutorial 参考&#xff1a;教程 | Vue.js (vuejs.org) 该教程需要前置知识&#xff1a;HTML, CSS, JavaScript 学习前置知识&#xff0c;你可以去 MDN Vue framework 是一个 JavaScript framework&#xff0c;以下简称 Vue&#xff0c;下面是它的特点 声明式渲染&#xff…...

SQLite数据库介绍

文章目录 SQLite常用接口 使用示例测试 SQLite SQLite是一个本地化的数据库,不需要客户端服务端什么的配置,主打就是轻量化方便化 他也不是一个独立的进程,而是可以根据应用程序的需求,可以进行静态或者动态的连接 而且他是直接存储在磁盘文件的,提供了简单易用的API接口 需…...

点击label 按钮起作用

要使点击 标签时能够触发与之关联的表单控件&#xff08;如输入框、复选框或单选按钮&#xff09;的作用&#xff0c;你需要正确地设置 标签的 for 属性&#xff0c;并确保该属性值与表单控件的 id 属性值相匹配。这样&#xff0c;当用户点击 标签时&#xff0c;与之关联的表…...

JPA、Hibernate、MyBatis三种ORM框架怎么选择

JPA&#xff08;Java Persistence API&#xff09;、Hibernate和MyBatis都是Java开发中常用的ORM&#xff08;Object-Relational Mapping&#xff0c;对象关系映射&#xff09;框架&#xff0c;它们提供了不同的方式来处理数据库交互。在选择这些框架时&#xff0c;需要考虑项目…...

【C++】map详解

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…...

力扣206.反转链表

题目链接&#xff1a;206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5]输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; …...

如何查看服务器的带宽linux服务器

speedtest-cli ubuntu # 安装speedtest-cli sudo apt install speedtest-cli # 执行测试 speedtest --secure # 在其他博客可以看到使用以下的命令&#xff0c;但是我试了没用 speedtest-cli参考&#xff1a; https://ubuntu-mate.community/t/speedtest-cli-error/25722/2…...

云原生化 - 工具镜像(完整版)

在微服务和云原生环境中,容器化的目标之一是尽可能保持镜像小型化以提高启动速度和减少安全风险。然而,在实际操作中,有时候需要临时引入一些工具来进行调试、监控或问题排查。Kubernetes提供了临时容器(ephemeral containers)的功能,允许在不改变原始容器镜像的情况下,…...

leetcode68:文本左右对齐

给定一个单词数组 words 和一个长度 maxWidth &#xff0c;重新排版单词&#xff0c;使其成为每行恰好有 maxWidth 个字符&#xff0c;且左右两端对齐的文本。 你应该使用 “贪心算法” 来放置给定的单词&#xff1b;也就是说&#xff0c;尽可能多地往每行中放置单词。必要时可…...

Linux驱动学习——内核编译

1、从官网下载适合板子的Linux内核版本 选择什么版本的内核需要根据所使用的硬件平台而定&#xff0c;最好使用硬件厂商推荐使用的版本 https://www.kernel.org/pub/linux/kernel/ 2、将压缩包复制到Ubuntu内进行解压 sudo tar -xvf linux-2.6.32.2-mini2440-20150709.tgz 然…...

MES系统:制造业的智能大脑

引言 在当今快速变化的制造业环境中&#xff0c;企业面临着激烈的市场竞争和不断变化的客户需求。为了保持竞争力&#xff0c;制造企业必须提高生产效率、降低成本、缩短产品上市时间&#xff0c;并确保产品质量。MES&#xff08;制造执行系统&#xff09;作为一种先进的生产管…...

NoSleep防休眠工具:系统唤醒与持续运行的高效解决方案

NoSleep防休眠工具&#xff1a;系统唤醒与持续运行的高效解决方案 【免费下载链接】NoSleep Lightweight Windows utility to prevent screen locking 项目地址: https://gitcode.com/gh_mirrors/nos/NoSleep 在数字化工作环境中&#xff0c;电脑意外休眠往往导致工作中…...

单机变联机:Nucleus Co-Op如何让你的电脑实现4人同屏游戏

单机变联机&#xff1a;Nucleus Co-Op如何让你的电脑实现4人同屏游戏 【免费下载链接】nucleuscoop Starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://gitcode.com/gh_mirrors/nu/nucleuscoop 你是否曾想过&#xff0c;用一…...

PDFMathTranslate:3步搞定学术论文AI翻译,完美保留公式排版的终极解决方案

PDFMathTranslate&#xff1a;3步搞定学术论文AI翻译&#xff0c;完美保留公式排版的终极解决方案 【免费下载链接】PDFMathTranslate PDF scientific paper translation with preserved formats - 基于 AI 完整保留排版的 PDF 文档全文双语翻译&#xff0c;支持 Google/DeepL/…...

Boomer:轻量高效的Linux屏幕放大镜工具

Boomer&#xff1a;轻量高效的Linux屏幕放大镜工具 【免费下载链接】boomer Zoomer application for Linux 项目地址: https://gitcode.com/gh_mirrors/boo/boomer 当你需要精准查看屏幕细节时是否常感到操作繁琐&#xff1f;无论是设计工作中的像素级调整、编程时的代码…...

Thanos.sh安全使用手册:避免数据灾难的10个终极技巧

Thanos.sh安全使用手册&#xff1a;避免数据灾难的10个终极技巧 【免费下载链接】Thanos.sh if you are Thanos(root), this command could delete half your files randomly 项目地址: https://gitcode.com/gh_mirrors/th/Thanos.sh Thanos.sh是一款以"随机删除一…...

如何用Awesome-Obsidian打造个性化知识管理神器:终极美化指南

如何用Awesome-Obsidian打造个性化知识管理神器&#xff1a;终极美化指南 【免费下载链接】awesome-obsidian &#x1f576;️ Awesome stuff for Obsidian 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-obsidian 想要将Obsidian从简单的Markdown编辑器变身为功…...

深入浅出:从原理到实践,手把手教你理解并校准RV1126 ISP的黑电平(BLC)

深入浅出&#xff1a;从原理到实践&#xff0c;手把手教你理解并校准RV1126 ISP的黑电平(BLC) 在数字图像处理领域&#xff0c;黑电平校准&#xff08;Black Level Calibration, BLC&#xff09;是一个看似简单却至关重要的环节。想象一下&#xff0c;当你用专业相机拍摄星空时…...

当触控板遇见鼠标:一场被重构的滚动革命

当触控板遇见鼠标&#xff1a;一场被重构的滚动革命 【免费下载链接】Scroll-Reverser Per-device scrolling prefs on macOS. 项目地址: https://gitcode.com/gh_mirrors/sc/Scroll-Reverser 在MacBook Pro的触控板上轻扫手指&#xff0c;网页随指尖方向自然滚动&#…...

Awesome-Awesome终极指南:如何快速找到任何技术领域的最佳资源

Awesome-Awesome终极指南&#xff1a;如何快速找到任何技术领域的最佳资源 【免费下载链接】awesome-awesome A curated list of awesome curated lists of many topics. 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-awesome 在技术学习和开发过程中&#xff…...

palworld-host-save-fix全攻略:解决幻兽帕鲁存档迁移难题的实战指南

palworld-host-save-fix全攻略&#xff1a;解决幻兽帕鲁存档迁移难题的实战指南 【免费下载链接】palworld-host-save-fix 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-host-save-fix 在幻兽帕鲁的冒险旅程中&#xff0c;更换服务器或迁移平台时的存档丢失问…...