弗洛伊德算法求最短路径

弗洛伊德算法(求最短路径) 弗洛伊德算法(求最短路径) 在一个加权图中,如果想找到各个顶点之间的最短路径,可以考虑使用弗洛伊德算法。 弗洛伊德算法既适用于无向加权图,也适用于有向加权图。使用弗洛伊德算法查找最短路径时,只允许环路的权值为负数,其它路径的权值必须为非负数,否则算法执行过程会出错。 弗洛伊德算法的实现思路 弗洛伊德算法是基于动态规划算法实现的,接下来我们以在图 1 所示的有向加权图中查找各个顶点之间的最短路径为例,讲解弗洛伊德算法的实现思路。 图 1 有向加权图 图 1 中不存在环路,且所有路径(边)的权值都为正数,因此 阅读详情
#include<iostream>
#include<string>
using namespace std;
/*邻接矩阵的类型定义*/
#define MAX 10000000
#define MAX_VERTEX_NUM 20
typedef struct
{
	string vexs[MAX_VERTEX_NUM];//用一维数组存储顶点信息
	int edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//用二维数组充当矩阵,来存储顶点边的信息
	int vexnum,edgenum;//顶点树和边数
}MGraph;
/*构造有向网的邻接矩阵*/
void CreateDN_AM(MGraph &G,int n,int e)
{
	G.vexnum=n;
	G.edgenum=e;
	
	int i,j,k;
	int weight;
	for(i=0;i<n;i++)
		cin>>G.vexs[i];//输入顶点信息
	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
		{
			if(i==j)
				G.edges[i][j]=0;//主对角线上的权值为0
			else
				G.edges[i][j]=MAX;//将矩阵初始化为MAX
		}
	for(k=0;k<e;k++)
	{
		cin>>i>>j>>weight;
		G.edges[i][j]=weight;
	}
}
/*弗洛伊德算法求最短路径*/
void ShortestPath_Floyd(MGraph &G)
{
	int i,j,k;
	int dist[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
	string path[2*MAX_VERTEX_NUM][2*MAX_VERTEX_NUM];
	for(i=0;i<G.vexnum;i++)
		for(j=0;j<G.vexnum;j++)
		{//初始化工作
			dist[i][j]=G.edges[i][j];
			if(dist[i][j]<MAX)
				path[i][j]=G.vexs[i]+G.vexs[j];
			else
				path[i][j]="";
		}
	//三个for循环求最短路径
	for(k=0;k<G.vexnum;k++)
		for(i=0;i<G.vexnum;i++)
			for(j=0;j<G.vexnum;j++)
				if(dist[i][k]+dist[k][j]<dist[i][j])
				{
					dist[i][j]=dist[i][k]+dist[k][j];
					path[i][j]=path[i][k]+path[k][j];
				}
	for(i=0;i<G.vexnum;i++)
	{
		for(j=0;j<G.vexnum;j++)
			cout<<path[i][j]<<" "<<dist[i][j]<<" ";
		cout<<endl;
	}
}
void main()
{
	freopen("in.txt","r",stdin);
	MGraph G;
	CreateDN_AM(G,4,6);
	ShortestPath_Floyd(G);
}

弗洛伊德算法主要是采用了dist二维数组来存储各个顶点之间的最短路径,然后不断更新,它的典型标识是有三个连续的for循环:将每一个顶点插入到另外两个顶点之间,看是否能得到较小的路径,这是它的主要思想,即是所谓的“试探”或是“动态”,其实理解是容易理解的,就是不好表达。

记得今年暑假在学校ACM培训时,老师讲到了这两个还有前面求最小路径的两个算法,当时的我,真的是没听懂啊,根本就看不懂这四个算法,是什么意思,但我对这四个算法记忆是那么的深,他们在我心里都有个死结了,今天终于搞懂他们了,比较开心啊。但是我对他们的熟练程度,几乎没有,也就是说要用的话,还需要再熟练一些,对他们的理解更深一些,嘿嘿,我会努力的,不过现在快要考试了,我还得紧张的复习,真舍不得不学数据结构啊!

 

【算法】弗洛伊德(Floyd)算法求最短路径 弗洛伊德算法用于计算图中各个顶点之间的最短路径迪杰斯特拉算法用于计算图中某一个顶点到其他顶点的最短路径弗洛伊德算法中每一个顶点都是出发访问点,所以需要将每一个顶点看作被访问顶点,求出从每一个顶点到其他顶点的最短路径;迪杰斯特拉算法通过选定的被访问顶点,求出从出发访问顶点到其他顶点的最短路径。 阅读详情

相关推荐

弗洛伊德算法(求每一对顶点间的最短路径)

每一对顶点间的最短路径 求解每一对顶点间的最短路径有两种方法:其一是分别以图中的每个顶点为源点共调用n次迪杰斯特拉算法;其二是采用下面介绍的弗洛伊德算法。这两种算法的时间复杂度均为O(n^3),但后者形式上较简单。 仍然使用带权的邻接矩阵arcs来表示有向网G,求从顶点vi到vj的最短路径。算法的实现要引入以下辅助的数据结构。 (1)二维数组Path[i][j]:最短路径上顶点vj的前一顶点的序号...

qq_44024359的博客 3581

弗洛伊德(Floyd's)算法—解决最短路径经典算法

弗洛伊德算法(Floyd's algorithm)是一种用于解决图中最短路径问题的经典算法。由美国计算机科学家罗伯特·弗洛伊德于1962年提出,该算法通过动态规划的思想,在图中寻找任意两个节点之间的最短路径,具有广泛的应用。本文将详细介绍弗洛伊德算法的原理、实现细节以及应用案例。一、原理动态规划思想:弗洛伊德算法利用了动态...

一条晒干的咸鱼的博客 3046

Floyd(弗洛伊德算法) 求最短路径 有向图

暑假,小哼准备去一些城市旅游。有些城市之间有公路,有些城市之间则没有,如下图。为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程。 上图中有4个城市8条公路,公路上的数字表示这条公路的长短...

yjyxw的博客 3591

【算法】最短路径——弗洛伊德 (Floyd) 算法

本文介绍了弗洛伊德 (Floyd) 算法的相关知识。

代码星辰的博客 1万+

RT-Thread NANO V4.1.1 在Cortex-M0上移植踩坑记:解决内存分配宏导致的线程创建失败

本文详细记录了RT-Thread NANO V4.1.1在Cortex-M0平台移植过程中遇到的内存分配宏配置问题,导致线程创建失败的解决方案。通过分析内存管理算法宏定义,将RT_USING_SMALL_MEM替换为RT_USING_SMALL_MEM_AS_HEAP,成功解决了线程创建问题,为开发者提供了实用的移植经验。

weixin_29189373的博客 307

STM32:TTL串口调试

TTL只需要两个线就可以完成两个设备之间的双向通信,一个发送电平的I/O称之为TX,与另一个设备的接收I/O口RX相互连接。两设备之间还需要连接地线(GND),这样两设备就有相同的0V参考电势。

superSmart_Dong的博客 5640

图算法——求最短路径(Floyd算法)

在网图和非网图中,最短路径的含义是不同的。由于非网图没有边上的权值,所谓最短路径,其实指的就是两个顶点之间经过的边数最少的路劲(即可以理解为把每一条边的权值看作是1)。对于网图来说,所谓最短路径,就是指两顶点之间经过的边上的权值之和最少的路径,并且我们称路径上的第一个顶点是源点,最后一个顶点是终点。求带权有向图G的最短路径问题一般可分为两类:一是单源最短路径,即求图中某一个顶点到其它顶点的最短路径,可以通过经典的 Dijkstra(迪杰斯特拉)算法求解(这是我写的一篇博客,有兴趣的同学可以看下,

在夜里行走的博客 9309

【Docker】搭建一个媒体服务器插件后端API服务 - MetaTube

本教程基于群晖的NAS设备DS423+的docker功能进行搭建,DSM版为 7.2.1-69057 Update 5。MetaTube是一个媒体服务器插件,主要用于Emby和Jellyfin媒体服务器。它的主要功能是从互联网上抓取内容并响应 JSON 数据,然后通过预安装的 MetaTube 插件请求服务器并下载相应的元数据,以与 Jellyfin/Emby 服务器配合使用。使用 MetaTube 的步骤大致如下:部署后端:首先,需要部署一个名为​ 的后端 API 服务器来抓取内容。

小小笔记大大用处 1万+

无向图弗洛伊德算法求最短路径 输出路径

弗洛伊德算法求最短路径 输出路径 弗洛伊德算法其实比较好理解 这里我用邻接矩阵的储存方法来写 一.算法思想 1.1 如果我们要用邻接矩阵来写代码的话,就要储存他的权值信息 这里我们用map[][]这个二维数组来储存 其次要输出他的最短路径 就用path[][]来储存 int map[100][100]; int path[100][100]; 1.2 初始化这个储存权值邻接矩阵 由于是无环图,自己到自己是 0 剩下的边的权值我们赋值为MAX for(int i=1; i<=n; i++)

yogur_father的博客 7825

电驱系统功率级“多合一”解决方案

如何提升电驱动系统的产品性能、减小能耗和进一步轻量化,以加强整车市场竞争力,是摆在国内外新能源车企面前的共同课题。为此,具有多年动力总成电子系统开发经验的美国著名半导体及电子解决方案专家——德州仪器(Texas Instrument)提出了多种功率级别“多合一”整合方案和设计思路,助力新能源车企提升技术优势。

yessunday的专栏 1372

免费获取船舶轨迹数据?手把手教你用Python处理中国海洋卫星AIS数据

本文详细介绍了如何免费获取中国海洋卫星AIS数据,并使用Python进行船舶轨迹数据的处理与分析。从数据源评估到自动化处理流水线,再到高级分析与可视化技巧,手把手教你避开常见问题,实现高效数据处理。特别适合航运数据分析、物流优化和海上安全研究等领域的研究者和开发者。

weixin_42616115的博客 320

弗洛伊德算法(求目标间的最短路径)

个人自用题目解析回顾。

e_dimension的博客 1339

PCL 从LAS文件中获取点云的颜色【2026最新版】

PCL从LAS文件中获取点云的RGB信息(pcl::PointXYZRGB)并进行可视化。博客长期更新,本文最新更新时间为:2026年5月4日。

点云侠的博客 1720

求最短路径 —— 弗洛伊德算法

弗洛伊德算法是求图中任意一对顶点间的最短路径的算法。 算法思想 递推产生一个n解方阵序列,,...,,..., 其中[ i ][ j ]表示从顶点到顶点的路径长度,k表示绕行第k个顶点的运算步骤。初始时,对于任意两个顶点和,若他们之间存在边,则以此边的权值作为它们之间的最短路径长度;若它们之间不存在有向边,则以∞作为它们之间的最短路径长度。以后逐步尝试在原路径中加入顶点...

Shishishi888的博客 4424

Android 14.0 系统设置显示主菜单添加屏幕旋转菜单实现旋转屏幕功能

在14.0的系统rom定制化开发中,在对系统设置进行定制开发中,有产品需求要求增加 旋转屏幕功能的菜单,就是在点击旋转屏幕菜单后弹窗显示旋转0度,旋转 90度,旋转180度, 旋转270度针对不同分辨率的无重力感应的大屏设备的屏幕旋转功能的实现, 接下来就来分析实现这个功能

安卓兼职framework和app工程师的博客 1312

CVAEGAN实现锂离子电池EIS数据增强:基于健康状态的阻抗谱生成

本文提出了一种基于CVAEGAN的锂离子电池EIS数据增强方法。该方法结合了变分自编码器和生成对抗网络的优点,能够根据指定的健康状态(SoH)生成高质量的EIS阻抗谱数据。文章详细介绍了数据预处理流程、模型架构设计(包括编码器、解码器和判别器),并提供了完整的PyTorch实现代码。通过条件生成的方式,该方法可以有效解决电池健康评估中标注数据不足的问题,为基于数据驱动的电池诊断提供更丰富的训练样本。实验结果表明,生成的EIS数据具有良好的真实性和多样性,可用于增强电池健康状态评估模型的性能。

huanghm88的专栏 499

1505.用弗洛伊德算法求赋权图的两点间的最短路径的长度

1505.用弗洛伊德算法求赋权图的两点间的最短路径的长度 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 用弗洛伊德算法求任意两点间的最短路径的长度, 输入 先输入一个小于100的正整数n,然后的n行输入图的邻接矩阵(10000表示无穷大,即两点之间没有边),之后再输入一个小于100的正整数m,最后的m行每行输入两个不同的0到n-1之间的整数表示两个点, 输出 用弗洛伊德...

Sunnyyang Pastebin 504

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

求最短路径之快速搞定弗洛伊德算法Floyd(C语言)

简介 迪杰斯特拉算法求最短路径:单源求最短路径,实质是贪心策略,时间复杂度(n^2).实际上如果求出所有点之间的最短路径,时间复杂度为(n^3)与弗洛伊德算法相同,总的还是迪杰斯特拉较好,但比较复杂。 弗洛伊德算法求最短路径:多源求最短路径——求出所有点之间的最短路径。时间复杂度为(n^3),实质上是暴力破解法——枚举法。 构成:俩个矩阵:①由各点之间的路径权值构成,无法到达的点为INF(无...

长臂人猿的博客 2820

计算机控制技术及应用

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

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

弗洛伊德基本思想弗洛伊德算法作为求最短路径的经典算法,其算法实现相比迪杰斯特拉等算法是非常优雅的,可读性和理解都非常好。 基本思想: 弗洛伊德算法定义了两个二维矩阵: 矩阵D记录顶点间的最小路径 例如D[0][3]= 10,说明顶点0 到 3 的最短路径为10; 矩阵P记录顶点间最小路径中的中转点 例如P[0][3]= 1 说明,0 到 3的最短路径轨迹为:

XXX 16万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

弗洛伊德(Floyd)算法求最短路径

涉及到的图如下: 代码如下: /** * 1,弗洛伊德算法实现 加全权图中的 寻求最短路径可以用来求解任意一点,到其他任意一点之间的最短距离。 * 2,设置顶点vi到顶点vk的最短路径已知为Lik,顶点vk到vj的最短路径已知为Lkj,顶点vi到vj的路径为Lij,则vi到vj的最短路径为:min((Lik+Lkj),Lij),vk的取值为图中所有顶点,则可获得vi到vj的最短路径 * 至于vi到vk的最短路径Lik或者vk到vj的最短路径Lkj,是以同样的方式获得 * 3,参考链接:

jialiang的博客 4810

采用弗洛伊德算法求带权有向图的最短路径

弗洛伊德算法介绍 弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。 Floyd优缺点分析 优点:容易理解,可以算出任意两个节点之间的最短距离,代码编写简单。 缺点:时间复杂度比较高,不适合计算大量数据。 Floyd算法与Dijkstra算法的不同 1.Floyd算...

xiezhi123456的博客 7373

弗洛伊德算法 求最短路径

暑假,小哼准备去一些城市旅游。有些城市之间有公路,有些城市之间则没有,如下图。为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程。 上图中有4个城市8条公路,公路上的数字表示这条公路的长短。请注意这些公路是单向的。我们现在需要求任意两个城市之间的最短路程,也就是求任意两个点之间的最短路径。这个问题这也被称为“多源最短路径”问题。 现在需要一个数据结构来存储图的信息,我们仍然可以用一个4*4的矩阵(二维数组e)来存储。比如1...

Meiko记录 3251

.弗洛伊德算法求最短路径

5. 弗洛伊德算法求最短路径 【问题描述】 对于下面一张若干个城市,以及城市之间距离的地图,请采用弗洛伊德算法求出所有城市之间的最短路径。 【输入形式】 顶点个数n,以及n*n的邻接矩阵,其中不可达使用9999表示。 【输出形式】 每两个顶点之间的最短路径和经过的顶点 注意:规定顶点自身到自身的dist值为0,此时path为该顶点编号。 【样例输入】 4 9999 4 11 9999 6 9999 2 9999 1 9999 9999 1 9999 3 9999 9999 【样

m0_63168183的博客 1028

求最短路径之弗洛伊德Floyd算法

1. 弗洛伊德Floyd算法介绍 Floyd算法又称为插点法,是一种用于寻找给定的加权图中多源点之间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。注意这个可不是心理学的那个弗洛伊德。 是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题。 算法的时间复杂度为O(N3),空间复杂度为O(N2)。 优点:容易理解,可以算出任意两个节点之间的最短距离,代码编写简单。 缺点:时间复杂度比较高,不适合计算大量数据。 2. 核心思

L-Dreams的博客 2923
上一篇: 迪杰斯特拉算法求最短路径 C++代码实现
下一篇: 静态查找的方法:顺序查找、对半查找、分块查找,C++代码实现
hackerain
博客等级 码龄16年 753粉丝 220原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值