最短路径模板+解析——(FLoyd算法)[通俗易懂]

最短路径模板+解析——(FLoyd算法)[通俗易懂]对于无权的图来说:若从一顶点到另一顶点存在着一条路径,则称该路径长度为该路径上所经过的边的数目,它等于该路径上的顶点数减1。由于从一顶点到另一顶点可能存在着多条路径,每条路径上所经过的边数可能不同,即路径长度不同,我们把路径长度最短(即经过的边数最少)的那条路径叫做最短路径,其路径长度叫做最短路径长度或最短距离。对于带权的图来说:考虑路径上各边上的权值,则通常把…

大家好,又见面了,我是你们的朋友全栈君。

 

最短路径模板+解析——(FLoyd算法)[通俗易懂]

对于无权的图来说:

若从一顶点到另一顶点存在着一条路径,则称该路径长度为该路径上所经过的边的数目,它等于该路径上的顶点数减1

由于从一顶点到另一顶点可能存在着多条路径,每条路径上所经过的边数可能不同,即路径长度不同,我们把路径长度最短(即经过的边数最少)的那条路径叫做最短路径,其路径长度叫做最短路径长度或最短距离。

 

最短路径模板+解析——(FLoyd算法)[通俗易懂]

对于带权的图来说:

考虑路径上各边上的权值,则通常把一条路径上所经边的权值之和定义为该路径的路径长度或称带权路径长度。

 从源点到终点可能不止一条路径,把带权路径长度最短的那条路径称为最短路径,其路径长度(权值之和)称为最短路径长度或者最短距离。

 

 

Floyd算法

Floyd算法(Floyd-Warshall algorithm)又称为弗洛伊德算法、插点法,是解决给定的加权图中顶点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。

适用范围:无负权回路即可,边权可正可负,运行一次算法即可求得任意两点间最短路。

 

优缺点:

Floyd算法适用于APSP(AllPairsShortestPaths),是一种动态规划算法,稠密图效果最佳,边权可正可负。此算法简单有效,由于三重循环结构紧凑,对于稠密图,效率要高于执行|V|次Dijkstra算法

优点:容易理解,可以算出任意两个节点之间的最短距离,代码编写简单

缺点:时间复杂度比较高,不适合计算大量数据。

时间复杂度:O(n^3);空间复杂度:O(n^2);

任意节点i到j的最短路径两种可能:

  1. 直接从i到j;
  2. 从i经过若干个节点k到j。

map(i,j)表示节点i到j最短路径的距离,对于每一个节点k,检查map(i,k)+map(k,j)小于map(i,j),如果成立,map(i,j) = map(i,k)+map(k,j);遍历每个k,每次更新的是除第k行和第k列的数。

步骤:

第1步:初始化map矩阵
矩阵中map[i][j]的距离为顶点i到顶点j的权值;

如果i和j不相邻,则map[i][j]=∞。

如果i==j,则map[i][j]=0;                                          
第2步:以顶点A(假设是第1个顶点)为中介点,若a[i][j] > a[i][1]+a[1][j],则设置a[i][j]=a[i][1]+a[1][j]。

最短路径模板+解析——(FLoyd算法)[通俗易懂]

无向图构建最短路径长度邻接矩阵:

最短路径模板+解析——(FLoyd算法)[通俗易懂]

最短路径模板+解析——(FLoyd算法)[通俗易懂]

最短路径模板+解析——(FLoyd算法)[通俗易懂]

最短路径模板+解析——(FLoyd算法)[通俗易懂]

最短路径模板+解析——(FLoyd算法)[通俗易懂]

最短路径模板+解析——(FLoyd算法)[通俗易懂]

最短路径模板+解析——(FLoyd算法)[通俗易懂]

最短路径模板+解析——(FLoyd算法)[通俗易懂]

 

 

核心代码:

最短路径模板+解析——(FLoyd算法)[通俗易懂]

有向图构建最短路径长度邻接矩阵:

最短路径模板+解析——(FLoyd算法)[通俗易懂]

步骤:

最短路径模板+解析——(FLoyd算法)[通俗易懂]

 

 

最短路径模板+解析——(FLoyd算法)[通俗易懂]

最短路径模板+解析——(FLoyd算法)[通俗易懂]

 

最短路径模板+解析——(FLoyd算法)[通俗易懂]

 

最短路径模板+解析——(FLoyd算法)[通俗易懂]

 

最短路径模板+解析——(FLoyd算法)[通俗易懂]

最短路径模板+解析——(FLoyd算法)[通俗易懂]

核心代码:

最短路径模板+解析——(FLoyd算法)[通俗易懂]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/124830.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月20日 上午6:00
下一篇 2022年4月20日 上午6:20


相关推荐

  • java栈方法_java栈的两种实现方法[通俗易懂]

    java栈方法_java栈的两种实现方法[通俗易懂]java栈的实现有两种方式:一.使用数组来实现://使用数组实现栈,功能包括进行内存扩展publicclassStack{privateint[]data;privateintlength;//表示初始化栈的内存长度privateinttop;//用来表示栈的实际长度privatefinalintexpandLength=20;//表示扩展的长度publicStack(i…

    2025年9月19日
    7
  • CHORD-X视觉战术指挥系统MySQL数据库集成教程:战术数据存储与分析

    CHORD-X视觉战术指挥系统MySQL数据库集成教程:战术数据存储与分析

    2026年3月12日
    2
  • 阶段小结

    阶段小结

    2021年9月29日
    42
  • Cloudsim学习笔记——基本知识

    Cloudsim学习笔记——基本知识Cloudsim澳大利亚墨尔本学校的网格实验室和Gridbus项目推出,是在离散事件模拟包SimJava上开发的函数库,继承了GridSim的编程模型,特点:支持大型云计算的基础设施的建模和仿真; 一个自足的支持数据中心、服务代理人、调度和分配策略的平台独特功能:提供虚拟化引擎,旨在数据中心节点上帮助建立和管理多重的、独立的、协调的虚拟化服务; 在对虚拟化服务分配处理核心时能够在时…

    2022年10月13日
    5
  • java链表数据结构是什么_java 链表数据结构

    java链表数据结构是什么_java 链表数据结构首先,单链表相对于队列的优势在于存储地址不是连续的,这样的意义在于,操作其中的某一个位置的元素时不需要对之前的其他元素都进行内存操作,大大的为我们的计算机减压了。下面直接进入正题:先要定义一个结点类,如下:Java代码publicclassNode{Nodenext;//下一个结点的引用Objectobj;//结点元素publicNode(Objectobj){this.obj=obj;…

    2022年5月27日
    36
  • jetson tx1 配置SSD固态硬盘「建议收藏」

    jetson tx1 配置SSD固态硬盘「建议收藏」转载自:http://blog.csdn.net/hit2015spring/article/details/62217289配置外置SSD这里用的是三星EVO250G的SSD,支持SATA接口,ssd插上去开机是不能用的,TX1是没有识别的,需要的格式化为Linux支持的文件系统ext4.一系列配置之后可以把ssd设置为外置的存储,然后再把文件系统拷贝到SSD

    2022年6月29日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号