图的最短路径算法-迪杰斯特拉(Dijkstra)算法与弗洛伊德(Frolyd)算法(更新中)

一、最短路径算法(Shortest Path)

最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。

最短路径不一定是经过边最少的路径,但在这些最短路径中,长度最短的那一条路径上只有一条边,且它的权值在从源点出发的所有边的权值最小。

算法具体的形式包括:

  • 确定起点的最短路径问题:也叫单源最短路问题,即已知起始结点,求最短路径的问题。
  • 确定终点的最短路径问题:与确定起点的问题相反,该问题是已知终结结点,求最短路径的问题。在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题。
  • 确定起点终点的最短路径问题:即已知起点和终点,求两结点之间的最短路径。
  • 全局最短路径问题:也叫多源最短路问题,求图中所有的最短路径。

用于解决最短路径问题的算法被称做“最短路径算法”,有时被简称作“路径算法”。最常用的路径算法有:Dijkstra算法、A*算法、Bellman-Ford算法、SPFA算法(Bellman-Ford算法的改进版本)、Floyd-Warshall算法、Johnson最短路算法。

二、迪杰斯特拉(Dijkstra)算法

迪杰斯特拉(Dijkstra)算法是由荷兰计算机科学家艾兹赫尔·韦伯·迪杰斯特拉(Edsger Wybe Dijkstra),又译艾兹赫尔·韦伯·戴克斯特拉于1959年提出的,因此又叫戴克斯特拉。

Dijkstra 算法是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。
在这里插入图片描述

1. 算法思想

迪杰斯特拉算法的主要思想是通过不断更新顶点之间的最短路径,逐步找到从指定起点到各个顶点的最短路径。该算法以贪心策略为基础,在每一步选择当前最优的顶点,并根据该顶点更新其他顶点的距离值,确保已确定的最短路径不再被修改。通过反复进行这样的选择和更新,最终得到了从起点到所有其他顶点的最短路径。

总的来说,迪杰斯特拉算法的思想就是以逐步迭代的方式,通过不断选择当前最优的顶点,更新其他顶点的距离值,直至得到起点到各个顶点的最短路径。

2. 算法步骤

  1. 初始化:创建一个集合 Q 存放未确定最短路径顶点,初始包含所有顶点;创建一个集合 S 存放所有已知实际最短路径值的顶点,初始为空;创建一个数组 dist 存放最短距离数组,记录每个顶点到起点的最短距离,初始值都为无穷大,起点的距离为0。
  2. 选取起点:从集合 Q 中选取一个离起点距离最短的顶点,将其移动到集合 S 中。
  3. 更新距离:对于当前确定最短路径的顶点,遍历其所有相邻顶点,如果通过当前顶点到达相邻顶点的距离小于相邻顶点当前记录的最短距离,则更新相邻顶点的最短距离为新的距离值,更新完相邻顶点的最短距离后,将这些顶点从集合 Q 移动到集合 S
  4. 重复步骤2和步骤3,直到集合 Q 为空。
  5. 最终得到起点到每个顶点的最短路径。

三、弗洛伊德(Frolyd)算法

弗洛伊德(Floyd-Warshall,Floyd )算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德(Robert W. Floyd)命名。

Floyd 算法以动态规划为基础,该算法通过不断更新顶点之间的最短路径长度,以找到任意两个顶点之间的最短路径长度。

1. 算法思想

弗洛伊德算法的算法思想是通过动态规划的方式来求解图中所有点对之间的最短路径。该算法的核心思想是利用一个中间顶点集合,逐步缩小这个集合的规模,更新并维护每对顶点之间的最短路径长度。

具体而言,弗洛伊德算法通过多次迭代,尝试在已知顶点之间的最短路径基础上,考虑添加一个新的中间顶点后是否可以缩短路径长度。如果存在更短的路径,就更新当前已知的最短路径长度;否则保持原状。不断重复这个过程,最终得到所有点对之间的最短路径长度矩阵。

弗洛伊德算法的动态规划思想在于利用已知的最短路径信息来推导出更长路径的最短路径,通过不断更新和迭代,最终得到所有顶点之间的最短路径长度。

2. 算法步骤

  1. 初始化:创建一个二维数组 distance,其中 distance[i][j] 表示顶点 i 到顶点 j 的最短路径长度。将 distance[i][j] 初始化为连接顶点 i 和 j 的边的权重。如果不存在直接相连的边,则将 distance[i][j] 初始化为无穷大。

  2. 更新最短路径:对于每对顶点 i 和 j,遍历所有顶点 k,比较通过顶点 k 是否可以使顶点 i 到 j 的路径变得更短,即检查 distance[i][k] + distance[k][j] 是否小于当前已知的 distance[i][j]。如果是,则更新 distance[i][j] = distance[i][k] + distance[k][j]。

  3. 重复更新:重复执行步骤2,直到所有顶点对之间的最短路径长度都被计算出来。

  4. 检查负权回路:如果存在负权回路,即顶点到自身的距离小于0,说明图中存在无限可减小的路径长度,算法将无法正常运行。

  5. 最终得到所有点对之间的最短路径长度矩阵。

四、最短路径算法对比

如果遇到单源且边为正数,直接Dijkstra。
至于 使用朴素版还是 堆优化版 还是取决于图的稠密度, 多少节点多少边算是稠密图,多少算是稀疏图,这个没有量化,如果想量化只能写出两个版本然后做实验去测试,不同的判题机得出的结果还不太一样,一般情况下,可以直接用堆优化版本。

如果是遇到多源点求最短路,直接 Floyd。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/58289.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu编译ffmpeg

配置 运行环境:vmware ubuntu 20.04 时间:2024年10月24日 权限问题:由于ubuntu权限问题 建议使用root权限编译,且~是根据用户组来进行定位的。 环境配置更新 cd ~ && \ mkdir ffmpeg_sources ffmpeg_build bin &…

EasyExcel自定义下拉注解的三种实现方式

文章目录 一、简介二、关键组件1、ExcelSelected注解2、ExcelDynamicSelect接口(仅用于方式二)3、ExcelSelectedResolve类4、SelectedSheetWriteHandler类 三、实际应用总结 一、简介 在使用EasyExcel设置下拉数据时,每次都要创建一个SheetWr…

【vs2022】windows可用的依赖预编译库

ffmpeg 、x264 、x265 等。obs是基于qt6+vs2022+64bit obs的官网传统构建已经不用了obs的s2022构建OBS Deps Build 2024-09-12FFmpeg4.4 库,x64 可用。

每天五分钟深度学习pytoroch:基于pytorch搭建逻辑回归算法模型

本文重点 前面我们学习了线性回归模型的搭建,无论是基于pytorch还是不基于pytorch,以上的模型都是回归模型,本文我们将使用pytorch搭建逻辑回归模型,逻辑回归模型是一个经典的分类问题。 模型搭建 class LogisticRegression(nn.Module) : def __init__(self) :super (Lo…

玩转Docker | 使用Docker部署推箱子网页小游戏

玩转Docker | 使用Docker部署推箱子网页小游戏 一、项目介绍项目简介项目预览 二、系统要求环境要求环境检查Docker版本检查检查操作系统版本 三、部署推箱子网页小游戏下载镜像创建容器检查容器状态检查服务端口安全设置 四、访问推箱子网页小游戏五、总结 一、项目介绍 项目…

Iperius Backup(数据备份软件) v8.3.0 中文免费版

下载: 【1】https://pan.quark.cn/s/19ef716c02d5 【2】https://drive.uc.cn/s/197acba8d8d94?public1 Iperius Backup是一款专业的备份还原软件,功能强大,支持DAT备份、LTO备份、NAS备份、磁带备份、RDX驱动器、USB备份,满足用…

K8S测试pod内存和CPU资源不足

只设置requests参数 mysql主从pod启动后监控 读压测之后 同时设置limits和requests,只调低内存值 监控 压力测试 同时设置limits和requests,只调低CPU值 初始状态 开始压测 结论 对于CPU,如果pod中服务使用CPU超过设置的limits&…

谷歌云GCP基础概念讲解

概览 云的基础是虚拟化:服务器,存储,网络。服务器是远程计算机的逻辑分区。存储是物理硬盘的逻辑划分。网络则是虚拟私有云。 谷歌是唯一一个拥有全球私有基础设施的公司;他们的谷歌云基础设施没有任何一部分通过公共互联网。换句…

Python 爬虫的寻宝大冒险:如何捕获 API 数据的宝藏

在这个信息爆炸的数字时代,数据就像是隐藏在网络深处的宝藏,等待着勇敢的探险家去发现。今天,我们要讲述的是如何成为一名 Python 爬虫探险家,装备你的代码工具,深入 API 的迷宫,捕获那些珍贵的数据宝藏。 …

C++,STL 051(24.10.28)

内容 1.map容器的构造函数。 2.map容器的赋值操作。 运行代码 #include <iostream> #include <map>using namespace std;void printMap(map<int, int> &m) {for (map<int, int>::iterator it m.begin(); it ! m.end(); it){cout << &quo…

《链表篇》---环形链表II(返回节点)

题目传送门 方法一&#xff1a;哈希表&#xff08;与环形链表类似&#xff09; 很容易就可以找到链表的相交位置。 public class Solution {public ListNode detectCycle(ListNode head) {if(head null || head.next null){return null;}Set<ListNode> visited new Ha…

从0开始深度学习(17)——数值稳定性和模型初始化

在每次训练之前&#xff0c;都会对模型的参数进行初始化&#xff0c;初始化方案的选择在神经网络学习中起着举足轻重的作用&#xff0c; 它对保持数值稳定性至关重要。 我们选择哪个函数以及如何初始化参数可以决定优化算法收敛的速度有多快。 糟糕选择可能会导致我们在训练时遇…

重学SpringBoot3-怎样优雅停机

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-怎样优雅停机 1. 什么是优雅停机&#xff1f;2. Spring Boot 3 优雅停机的配置3. Tomcat 和 Reactor Netty 的优雅停机机制3.1 Tomcat 优雅停机3.2 Reac…

【C++初阶】模版入门看这一篇就够了

文章目录 1. 泛型编程2. 函数模板2. 1 函数模板概念2. 2 函数模板格式2. 3 函数模板的原理2. 4 函数模板的实例化2. 5 模板参数的匹配原则2. 6 补充&#xff1a;使用调试功能观察函数调用 3. 类模板3 .1 类模板的定义格式3. 2 类模板的实例化 1. 泛型编程 在C语言中&#xff0…

动态规划-子序列问题——1027.最长等差数列

1.题目解析 题目来源&#xff1a;1027.最长递增子序列——力扣 测试用例 2.算法原理 1.状态表示 等差数列至少是三个数&#xff0c;所以一维数组显然无法满足状态表示&#xff0c;所以需要开辟一个二维数组来表示&#xff0c;二维数组的两个下标分别是倒数第一与倒数第二个数 …

【JSON相关漏洞(Hijacking+Injection)挖掘技巧及实战案例全汇总】

JSON相关漏洞&#xff08;HijackingInjection&#xff09;挖掘技巧及实战案例全汇总 本文一是在为测试过程中遇到json返回格式时提供测试思路&#xff0c;二是几乎所有国内的资料都混淆了json和jsonp的区别——这是两种技术&#xff1b;以及json和jsonp hijacking的区别——这…

基于知识图谱的设备问答系统

你是不是还在为毕业设计苦恼&#xff1f;今天我就来给大家分享一款基于知识图谱的设备问答系统&#xff0c;不仅技术领先&#xff0c;而且非常适合用作毕业设计项目&#xff0c;帮助你轻松通过&#xff01; 项目简介 这个设备问答系统基于Django&#xff08;后端框架&#xf…

从零开始的 vue项目部署到服务器详细步骤(vue项目build打包+nginx部署+配置ssl证书)

从零开始的 vue项目部署到服务器详细步骤&#xff08;vue项目build打包nginx部署配置ssl证书&#xff09; 文章目录 从零开始的 vue项目部署到服务器详细步骤&#xff08;vue项目build打包nginx部署配置ssl证书&#xff09;一、前言二、vue项目部署前配置1、vite.config.js 增加…

ubuntu内核更新导致显卡驱动掉的解决办法

方法1&#xff0c;DKMS指定内核版本 用第一个就行 1&#xff0c;借鉴别人博客解决方法 2&#xff0c;借鉴别人博客解决方法 方法2&#xff0c;删除多于内核的方法 系统版本&#xff1a;ubuntu20.24 这个方法是下下策&#xff0c;如果重装驱动还是不行&#xff0c;就删内核在…

豆瓣同城活动采集-过去一年到未来已定档活动

通过采集豆瓣同城活动&#xff0c;来辅助分析一个城市的文商旅体活跃繁荣程度。 以成都为例&#xff0c;2023年10月30日到2024年11月未来已定档活动期间&#xff0c;豆瓣同城活动共有975场。 示例数据&#xff1a; 活动网址&#xff1a;有&#xff0c;此处不显示 封图网址&…