详细论述最短路径(迪杰斯特拉算法和弗洛依德算法)

最小生成树(prime算法、kruskal算法) 和 最短路径算法(floyd、dijkstra) 文章转自:http://www.cnblogs.com/aiyelinglong/archive/2012/03/26/2418707.html 简介: 带权图分为有向和无向,无向图的最短路径又叫做最小生成树,有prime算法和kruskal算法;有向图的最短路径算法有dijkstra算法和floyd算法。   生成树的概念:联通图G的一个子图如果是一棵包含G的所 阅读详情

一、迪杰斯特拉算法

      通常用迪杰斯特拉算法求图中某一顶点到其他各个顶点的最短路径。

1、算法思想

      设有两个集合S、T,集合S中存放图中已找到最短路径的顶点,集合T存放图中剩余顶点。初始状态时,集合S中只包含源点v0,然后不断地从集合T中选取到顶点v0路径最短长度的顶点vu并入到集合S中。集合S每并于一个新的顶点vu,都要修改顶点v0到集合T中顶点的最短路径长度。 不断重复此过程,直到集合T的顶点全部并入到S中。

2、算法执行过程

      引入三个辅助数组dist[]、path[]和set[]。
      dist[vi]表示当前已找到的从v0到vi的最短路径长度。它的初始状态为:若v0到vi有边,则dist[vi]为边上的权值,否则置为无穷。
      path[vi]保存从v0到vi最短路径上vi的前一个顶点。它的初始状态为:若v0到vi有边,则path[vi] = v0,否则path[vi] = -1。
      set[]为标识数组,set[vi] = 1则表示已经并入到S中,set[vi] = 0则表示还未并入最短路径。它的初始状态为:set[v0] = 1,其他全为0。
      迪杰斯特拉算法的执行过程如下:
      1)从当前的dist[]数组中选取最小值,假设为dist[vu],则将set[vu]置为1,表示当前新并入的顶点是vu。
      2)循环扫描图中的顶点,对每个顶点进行检测:
      假设当前顶点为vj,检测set[vj]是否等于1,等于1则表示已经并入到S中,则不再进行任何操作。若等于0,则比较dist[vj]和dist[vu]+w的值,其中w为边vj和vu的权值。如果dist[vj]较大,则用新的路径长度更新旧的,并把vu加入路径中。
      3)对前两个步骤循环n-1次(n为图的边数),即可得到v0到其余顶点的最短路径长度。
      下面将以一个例子来体会迪杰斯特拉算法求解最短路径长度的过程。
对于下图所示的有向图,初始态为:
      dist[0] = 0, dist[1] = 4, dist[2] = 6, dist[3] = 6,其余全为无穷
      path[1] = 0, path[2] = 0, path[3] = 0,其余全为-1
      set[0] = 1,其余全为0
在这里插入图片描述
      1) 从通往其余顶点的路径中选出最短路径长度,即0—>1,长度为dist[1] = 4,因此将顶点1并入到最短路径中,set[1] = 1,结果如下图:
在这里插入图片描述
      以1为中间点检测其他剩余的顶点2,3,4,5,6
      (1)dist[2] = 6 > dist[1] + g[1][2] = 5,因此将dist[2]置为5,path[2]置为1
      (2)dist[3] = 6 < dist[1] + g[1][3] = 无穷,因此dist[3]不变,path[3]不变
      (3)dist[4] = 无穷 > dist[1] + g[1][4] = 11,将dist[4]置为11,path[4]置为1
      (4)dist[5] = 无穷 = dist[1] + g[1][5] = 无穷,因此dist[5]不变,path[5]不变
      (5)dist[6] = 无穷 = dist[1] + g[1][6] = 无穷,因此dist[6]不变,path[6]不变
      (6)dist[3] = 6 < dist[1] + g[1][3] = 无穷,因此dist[3]不变,path[3]不变
      2) 从通往剩余顶点的路径中选出最短的是0—>1—>2,长度为dist[2] = 5,因此将顶点2并入最短路径中,set[2] = 1 ,结果如下图所示:
在这里插入图片描述
      以2为中间点检测剩余顶点3,4,5,6
      (1)dist[3] = 6 < dist[2] + g[2][3] = 无穷,因此dist[3]不变,path[3]不变
      (2)dist[4] = 11 = dist[2] + g[2][4] = 11,因此dist[4]不变,path[4]不变
      (3)dist[5] = 无穷 > dist[2] + g[2][5] = 9,因此将dist[5]置为9,path[5]置为2
      (4)dist[6] = 无穷 = dist[2] + g[2][6] = 无穷,因此dist[6]不变,path[6]不变
      重复上述步骤,直到所有顶点并入到最短路径中 ,结果为:
在这里插入图片描述

3、算法代码

void Dijkstra(M g,int v int dist[],int path[]){
	int set[maxSize];
	int min , i , j , u;
	//初始化
	for(i = 0;i<g.n;i++){
		dist[i] = g,edges[v][i];
		set[i] = 0;
		if(g.edges[v][i] < INF) path[i] = v;
		else path[i] = -1;
	}
	set[v] = 1;
	path[v] = -1;
	for(i = 0;i<g.n-1;i++){
		min = INF;
		for(j = 0;j<g.n;j++){
			if(set[j] == 0&dist[j]<min){
				u = j;
				min = dist[j];
			}
		}
		set[u] = 1;//将选出的顶点并入最短路径
		for(j = 0;j<g.n;j++){
			if(set[j] == 0&&dist[u]+g.edges[u][j] < dist[j]){
				dist[j] = dist[u]+g.edges[u][j];
				path[j] = u;
			}
		}
	}
}

//时间复杂度为O(n^2)

二、弗洛伊算法

      迪杰斯特拉算法是求图中某一顶点到其余各顶点的最短路径,如果求图中任意一对顶点的最短路径,则通常用弗洛伊算法。
      弗罗伊算法的求解步骤为:
      1)设置两个矩阵A和Path,初始时将图的邻接矩阵赋值给A,将矩阵Path中的元素全部置为 -1
      2)以顶点k为中间顶点,k取0~n-1(n为图的顶点数),对图中所有顶点对进行如下检测:
      如果A[ i ][ j ] > A[ i ][ k ] + A[ k ][ j ],则将A[ i ] [ j ]改为A[ i ][ k ] + A[ k ][ j ]的值,将Path[ i ][ j ]改为k,否则不进行任何操作。
      下面将将一个例子,如下图所示一个有向图:
在这里插入图片描述
      对于上图,对应的邻接矩阵为:
在这里插入图片描述
      初始时设置两个矩阵A和Path,矩阵A用来记录当前已经求得的任意两个顶点最短路径的长度,Path用来记录当前两个顶点间最短路径上要经过的中间点。
      1)初始时有:
在这里插入图片描述
      2)以0为中间点,参照上一步矩阵中的结果,检测的所有顶点对:{0,1},{0,2},{0,3},{1,0},{1,2},{1,3},{2,0},{2,1},{2,3},{3,0},{3,1},{3,2},假设当前所检测的顶点对位{i,j},如果A[ i ][ j ] > A[ j ][ 0 ] + A[ 0 ][ j ],则将A[ i ][ j ]改为[ j ][ 0 ] + A[ 0 ][ j ]的值,并将Path[ i ][ j ]改为0。经过检测与修改后,所得矩阵如下:
在这里插入图片描述
      3)以1为中间点,参照上一步的结果,检测所有顶点对,其中A[ 0 ][ 2 ] > A[ 1 ][ 2 ] = 5 + 4 = 9,因此将A[ 0 ][ 2 ]改为9,Path[ 0 ][ 2 ]改为1。经过检测与修改后,所得矩阵如下:
在这里插入图片描述
      重复上述步骤,得到最终的矩阵如下:
在这里插入图片描述
      由矩阵A可以查出图中任意两个顶点之间的最短路径长度,如顶点1到顶点3的最短路径长度为A[ 1 ][ 3 ] = 2
      由矩阵Path可以算出任意两点间最短路径上的顶点序列,如顶点1到顶点0最短路径可以按下面步骤求得:
      (1)由Path[ 1 ][ 0 ] = 3,可知经过顶点3,把顶点3作为下一步起点
      (2)由Path[ 3 ][ 0 ] = 2,可知经过顶点2,把顶点2作为下一步起点
      (1)由Path[ 2 ][ 0 ] = -1,可知顶点2有到顶点0的边,求解结束
      从顶点1到顶点0最短路径为1—> 3 —> 2 —> 0

void Floyd(M g , int Path[][maxSize]){
	int i , j , k;
	int A[maxSize][maxSize];
	//初始化
	for(i=0;i<g.n;i++)
		for(j=0;j<g.n;j++){
			A[i][j] = g.edges[i][j];
			Path[i][j] = -1; 
		} 
	//检测与修改
	for(k=0;k<g.n;k++)
		for(i=0;i<g.n;i++)
			for(j=0;j<g.n;j++){
				if(A[i][j] > A[i][k]+A[k][j]){
					A[i][j] = A[i][k]+A[k][j];
					Path[i][j] = k;
				}	
			}
}

//时间复杂度为O(n^3)

写在最后

      码字不易,点个赞或者评个论再走可好?

Template 4:Dijkstra算法求最短路径 Dijkstra算法求最短路径的规范步骤 阅读详情

相关推荐

【详细】芯片设计全流程(包括每个流程需要用到的工具以及需要参与的工作人员)

一颗芯片的诞生经历了设计、制造和测试(分别对应集成电路产业链的设计业、制造业和封测业),而每一步都包含了复杂的步骤和流程。 图0-1 集成电路产业链 现在,我们重点介绍芯片设计的全流程以及每个流程需要用到的设计工具和需要参与的工作人员。 一、IC设计分类 首先对IC设计的分类做个介绍,如图1-1所示。 图1-1 IC设计分类 如图1-1所示,IC设计可以粗分为数字IC设计和射频/模拟IC设计,数字IC设计又可分为ASIC设计和FPGA/CPLD设计,此外还有一部分IC设计.

qq_36045093的博客 8万+

迪杰斯特拉算法求图的某个顶点到其他顶点的最短路径问题

迪杰斯特拉算法:使用图的广度优先遍历算法,比如先从G点出发,找到能与G直接连接的顶点,然后才从与G最近的A出发,找到与A相邻的节点。通过比较G到每个顶点的距离大小,才选出到每个点的最短路径 代码: /** * 迪杰斯特拉算法球最短路径问题 */ public class Dijkstra { public static void main(String[] args) { ...

weixin_43396422的博客 3042

AI变现案例实战系列4:AI数字员工团队——用OpenClaw搭建6个智能体,自动运营你的赚钱系统

摘要:谷歌AI产品经理Shubham Saboo利用OpenClaw搭建6人AI团队,实现内容创作、技术开发等任务自动化,每月成本不足400美元。文章对比阿里云和Windows本地两种部署方案,提供详细配置指南。通过多Agent架构实现物理隔离与精准协作,可创建6个专业AI角色(如研究员、运营、工程师等),每个Agent专注单一任务,避免记忆负担和上下文污染问题。阿里云方案适合长期稳定运行,Windows本地部署则适合零成本测试。最终可组建高效AI团队,实现7x24小时无人值守运营。(149字)

小明的博客 1141

数据结构--Dijkstra算法最清楚的讲解

迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止基本思想 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算)。 此外,引进两个集合S和U。S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该

heroacool的专栏 16万+

使用 STM32F7 和 TensorFlow Lite 开发低功耗人脸识别设备

我们讨论了 STM32F7 的特点和能力,TensorFlow Lite 在 STM32F7 上的应用,以及一些降低功耗的优化技术。- 准备模型:选择合适的人脸识别模型,在 TensorFlow 中进行训练和导出,并使用 TensorFlow Lite 转换为适用于 STM32F7 的量化模型。请注意,上述代码仅展示了如何加载和运行 TensorFlow Lite 模型的方法,实际应用中需要集成人脸检测和识别模型,并根据实际需求进行相应的输入和输出处理。结合这两个工具,我们可以开发出低功耗的人脸识别设备。

weixin_66608063的博客 2586

【chatgpt代码系列】磁导航纠偏算法推导

例如,可以根据AGV偏离路径的方向和距离,计算出需要进行的修正角度和移动距离,然后通过控制算法实现对AGV的纠偏。具体来说,磁导航AGV的行驶是通过磁场传感器感知地面磁场信号,然后根据信号的强度和方向来确定AGV的位置和方向,进而控制AGV的行驶。但是,在实际应用中,由于地面磁场信号的变化和干扰等因素,磁导航AGV可能会出现偏离路径的情况,导致行驶不稳定甚至出现误差。磁导航AGV纠偏公式是通过对AGV行驶中偏离路径的原因进行分析,结合磁导航AGV的工作原理和控制算法,推导出来的。假设AGV的目标方向为。

少磊的博客 2807

最短路径算法——迪杰斯特拉(Dijkstra)

算法思想 设G=(V,E)是一个带权有向图 把图中顶点集合V分成两组 第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了) 第二组为其余未确定最短路径的顶点集合(用U表示) 按最短路径长度的递增次序依次把第二组的顶点加入S中 在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不...

u012632105的博客 992

FDTD远场分析实战:从monitor数据到3D远场可视化的完整流程

本文详细介绍了FDTD远场分析的完整流程,从monitor采集的近场数据出发,通过近场-远场变换(NFFFT)生成3D远场可视化结果。文章重点解析了远场转换的物理原理、关键参数设置,并提供了构建稳健数据处理流水线及高级可视化(如3D辐射方向图)的实战脚本与技巧,适用于天线设计与光学器件分析。

weixin_29063035的博客 228

图的最短路径--迪杰斯特拉算法 c语言

还是按照书上的例子: 完整代码如下: #include <stdio.h> #include <stdlib.h> #include <string.h> #define MaxInt 32767//无穷值设置 #define MVNum 100 //图的最大容量 ,也可以称为图的最大顶点数 void Interrupt(void)//创建一个中断函数 { while(1)//用于检测换行符,使函数脱离scanf的连续输出 if(getchar()=='

qq_43402544的博客 3926

自动驾驶仿真工具链集成:ECU TEST与VTD、VERISTAND的深度配置指南

本文详细介绍了自动驾驶仿真测试中ECU TEST、VTD与VERISTAND三大核心工具的深度集成与连接配置方法。通过解析工具链的角色分工,提供从单机到分布式部署的实战指南,并重点阐述了Test Bench Configuration与Test Configuration的关键参数设置、SSH免密登录配置,以及在线与离线工作模式的切换技巧,旨在帮助测试工程师高效构建稳定、自动化的硬件在环测试环境。

wind6的博客 790

uniapp:人脸识别功能,已测试,直接复制源码,支持H5,APP安卓。不依赖任何js,SDK。

uniapp人脸识别功能,已测试可直接复制源码,支持H5,APP安卓。不依赖任何js,SDK。 APP效果图:

sunluyi的博客 2226

迪杰特斯拉算法+弗洛依德算法

迪杰特斯拉算法:求源点到任何一个其他点的最短路径 弗洛依德算法:可以看成是缔结特斯拉算法的一个扩展版,对迪杰特斯拉算法进行for循环就是佛洛依德算法。 首先来说大概思路: 上图是一个无向图,假设A是你在的地方,也就是源点,你想知道你到其他的地方的最短路径 设定一个数组flag来表示每个点是否被访问过,初始化都为0,表明都没被访问过 第一步: 设置一个存储A到各点距离的数组D[N],如果无法两点之...

阳光大男孩!!!的博客 1486

基于STM32的智能鞋柜系统设计与实现

摘要:本文设计并实现了一种基于STM32F103C8T6单片机的智能鞋柜系统。该系统通过DHT11温湿度传感器、PM2.5粉尘传感器和MQ-135空气质量传感器构建多维度环境监测网络,结合光电红外传感器和光敏传感器实现柜门状态识别与智能照明。系统采用分层控制策略,当温度低于15℃或湿度高于65%时自动启动加热和通风,PM2.5超标时启动通风,污染物浓度升高时激活紫外线杀菌。创新性地实现了柜门状态与紫外线消毒的双保险互锁机制,确保使用安全。测试结果表明,系统温湿度控制精度达±0.4℃/±2.0%RH,PM2.

3254968421的博客 253

(数据结构)图的最短路径 弗洛依德算法(Floyd)

图的最短路径 弗洛依德算法(Floyd)

GHY 477

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

m数据结构 day15 图(五)最短路径算法(Dijkstra VS Floyd)

文章目录最短路径算法迪杰斯特拉算法 Dijkstra佛洛依德算法 Floyd 最短路径算法 最短路径的现实应用很多很多。 迪杰斯特拉算法 Dijkstra 强调单源顶点查找路径的方式,符合人类的正常思路,所以原理容易被理解,但是代码比较复杂 佛洛依德算法 Floyd 完全抛开了单点的局限思维模式,巧妙的运用了矩阵的变换,用最清爽的代码实现了多顶点之间的最短路径的求解,原理理解难一点,但是代码很简洁。 ...

wulimmya的博客 651

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

最短路径之弗洛依德算法

注意:看这篇随笔之前请先看之前写的《最短路径之迪杰特斯拉算法》。在上一篇随笔中,我们了解到了迪杰特斯拉算法,不知道大家发现了没有,该算法算的是单源路径,也就是已经确定好了所求最短路径的起点城市,因此我们只使用了一维数组p[i],T[i],其实,这已经默认了是P[1][i]和T[1][i],也就是从一号城市到其他城市的最短路径,但是在现实生活中,我们可不只是只需要找某一个特定的城市...

baichu5080的博客 222

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

数据结构(Java)最短路径(迪杰斯特拉、弗洛伊德算法)

迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个结点到其他结点的最短路径。 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。 设置出发顶点为v,顶点集合V{v1,v2,vi...},v到V中各顶点的距离构成距离集合Dis,Dis{d1,d2,di...},Dis集合记录着v到图中各顶点的距离(到自身可以看作0,v到vi距离对应为di) 算法的通俗理解: 1.先定义 距离数组 和 已访问数组,并且初始化:与 G 点相关的权值照常填

萌萌虎的博客 5791

php计算最短距离,最短路径之弗洛依德算法

[导读]给一个N个点M条边的连通无向图,满足每条边最多属于一个环,有Q组询问,每次询问两点之间的最短路径。注意:看这篇随笔之前请先看之前写的《最短路径之迪杰特斯拉算法》。在上一篇随笔中,我们了解到了迪杰特斯拉算法,不知道大家发现了没有,该算法算的是单源路径,也就是已经确定好了所求最短路径的起点城市,因此我们只使用了一维数组p[i],T[i],其实,这已经默认了是P[1][i]和T[1][i],也就...

weixin_35874865的博客 216

万字总结——最短路径知识点归纳总结+DFS、GFS例题解答

如何求任意两点之间的最短路径呢?通过之前的学习,我们知道通过深度或广度优先搜察可以求出两点之间的最短路径。所以进行n^2 遍深度或广度优先搜索,即对每两个点都进行一次深度或广度优先搜索,便可以求得任意两点之间的最短路径。可是还有没有别的方法呢?

hua3473489608的博客 2881

迪杰斯特拉(Dijkstra)算法

算法小白学习迪杰斯特拉求最短路的心得,适合新手,内容比较详细,简单易懂。

qq_28783003的博客 776

最短路径算法:迪杰斯特拉算法和弗洛伊德算法(天勤数据结构高分笔记)

迪杰斯特拉算法算法思想: 设有两个顶点集合S和T,集合S存放途中已经找到最短路径的顶点,集合T存放的是途中剩余顶点。初始状态是,集合S只包含源点V0,然后不断从集合T中 选取到顶点V0的路径长度最短的顶点Vu并入到初始集合中。集合S每并入一个新的顶点Vu,都要修改顶点V0到集合T中顶点最短路径长度值。不断重复此过 程,直到集合T中所有顶点全部并入到S中为止。 在理解...

qq_15054345的博客 3928

c语言判断有向图是否有路径_7.6 最短路径

01前言1、假若要在计算机上建立一个交通资讯系统则可以采用图的结构来表示实际的交通网络。2、考虑到交通图的有向行(如航运,逆水和顺水时的船速就不一样)带权有向图中,称路径上的第一个顶点为源点,最后一个顶点为终点。02最短路径1、求最短路径的一个办法是,每次以一个顶点为源点,重复执行迪杰斯特拉算法n次。这样,便可求得每一对顶点之间的最短路径。总的执行时间为O(n的3次方)。2、弗洛依德算法:通过一个...

weixin_42521032的博客 466

【C++】图

关于图的一些介绍

mhyasadj的博客 1565

poj1125 最短路径

问题重述 描述 众所周知,证券经纪业依靠的就是过度的传言。您需要想出股票经纪人中传播假情报的方法,让您的雇主在股票市场的占据优势。为了获得最大的效果,你必须蔓延最快的方式谣言。 不幸的是你,股票经纪人信息只信任他们的“可靠来源”,这意味着你在你传播谣言之前必须考虑到他们的接触结构。它需要特定股票经纪人和一定的时间把谣言传递给他的每一位同事。你的任务将是写一个程序,告诉您选择哪一个股票经纪人作...

nc200830740306的专栏 230

图的应用-最短路径

3.接着,从V0和VO-V2出发,继续寻找最短路径,V0-V1依然不变是13,而V0-V2到V3,权值为8+5=13,除此之外无从V0/V2出发的路径能到达V3,所以V3的值改为13,V4没有V0-V2能直接到的边(就是走一条边就能到),所以依然是30不变,以此类推。下图中,比如由V0到V4的最短路径,有两条,一条是V0-V2-V3-V4=8+5+6=19,还有一条是V0直接到V4,权值是30,很明显19更小,所有19填入表中,以此类推,不再赘述。分析C到A,CBA,C没有直接到B的,所以不必改。

2503_92676673的博客 1196

最短路径(Dijsktra算法、Floyd算法)

1、最短路径:   两个结点之间,带权路径长度最短的路径。   常用算法是Dijkstra算法和Floyd算法,区别在于Dijsktra算法每次只能算出某一个结点到其他结点的最短路径,而Floyd算法可以直接把图中任意两个结点的最短路径都算出来。   最短路径一定是简单路径。 2、Dijkstra(迪杰斯特拉)算法   a、利用了三个数组        dist [ ] 表示距离源点的距离...

寻找到底哪里有蓝天 131
上一篇: 二路归并排序和基数排序
下一篇: 二叉排序树的定义及其基本算法
Two_Bits
博客等级 码龄8年 25粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值