Floyd算法求解各顶点之间最短路径问题

这篇具有很好参考价值的文章主要介绍了Floyd算法求解各顶点之间最短路径问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Floyd算法

  • 概述

Floyd算法,也称为Floyd-Warshall算法,是一种用于求解图中所有节点之间最短路径的算法。Floyd算法可以处理负权边的情况,但是不能处理负权环。
Floyd算法基于动态规划思想,通过一个二维数组记录从一个节点到另一个节点的最短路径长度。算法的核心思想是逐渐增加中间节点,如果在加入一个中间节点后能够获得更短的路径,则更新路径长度。经过n次迭代之后,最终可以得到图中任意两个节点之间的最短路径长度。

  • 示例
  1. 初始状态

Floyd算法求解各顶点之间最短路径问题

如图:这是一个有三个顶点的有向图,矩阵A存储了两点之间的最短距离,在初始状态下就是一个邻接矩阵;矩阵pre记录了两点之间的最短路径中,加入的中转顶点。

  1. v 0 v_0 v0为中转点
初始状态 路径长度 加入中转点 v 0 v_0 v0 路径长度 是否加入
v 1 v_1 v1 -> v 1 v_1 v1 0 v 1 v_1 v1 -> v 0 v_0 v0 -> v 1 v_1 v1 10 + 6 = 16 ×
v 1 v_1 v1 -> v 2 v_2 v2 4 v 1 v_1 v1 -> v 0 v_0 v0 -> v 2 v_2 v2 10 + 13 = 23 ×
v 2 v_2 v2 -> v 1 v_1 v1 ∞ \infty v 2 v_2 v2 -> v 0 v_0 v0 -> v 1 v_1 v1 5 + 6 =11
v 2 v_2 v2 -> v 2 v_2 v2 0 v 2 v_2 v2 -> v 0 v_0 v0 -> v 2 v_2 v2 5 + 13 = 18 ×

所以,在 v 2 v_2 v2 -> v 1 v_1 v1之间加入点 v 0 v_0 v0作为中转。这里没有考虑在 v 0 v_0 v0 -> v 0 v_0 v0 v 0 v_0 v0 -> v 1 v_1 v1 v 0 v_0 v0 -> v 2 v_2 v2 v 1 v_1 v1 -> v 0 v_0 v0 v 2 v_2 v2 -> v 0 v_0 v0中加入 v 0 v_0 v0作为中转,因为这没有意义;我们将计算得出的结果反映在下图中,将 A ( 1 ) A^{(1)} A(1)[ v 2 v_2 v2][ v 1 v_1 v1]的值置为11,表示在加入 v 0 v_0 v0作为中转之后,最短路径的长度由 ∞ \infty 变为了11, A ( 1 ) A^{(1)} A(1)[ v 2 v_2 v2][ v 1 v_1 v1]的值置为0,表示 v 2 v_2 v2 v 1 v_1 v1这个路径路径中,加入了 v 0 v_0 v0作为中转点。

Floyd算法求解各顶点之间最短路径问题

  1. v 1 v_1 v1为中转点
初始状态 路径长度 加入中转点 v 0 v_0 v0 路径长度 是否加入
v 0 v_0 v0 -> v 0 v_0 v0 0 v 0 v_0 v0 -> v 1 v_1 v1 -> v 0 v_0 v0 6 + 10 = 16 ×
v 0 v_0 v0 -> v 2 v_2 v2 13 v 0 v_0 v0 -> v 1 v_1 v1 -> v 2 v_2 v2 6 + 4 = 10
v 2 v_2 v2 -> v 0 v_0 v0 5 v 2 v_2 v2 -> v 1 v_1 v1 -> v 0 v_0 v0 11 + 10 = 21 ×
v 2 v_2 v2 -> v 2 v_2 v2 0 v 2 v_2 v2 -> v 1 v_1 v1 -> v 2 v_2 v2 11 + 4 = 5 ×

分析过程同上,结果如下图

Floyd算法求解各顶点之间最短路径问题

  1. v 2 v_2 v2为中转点
初始状态 路径长度 加入中转点 v 0 v_0 v0 路径长度 是否加入
v 0 v_0 v0 -> v 0 v_0 v0 0 v 0 v_0 v0 -> v 2 v_2 v2 -> v 0 v_0 v0 10 + 5 = 156 ×
v 0 v_0 v0 -> v 1 v_1 v1 6 v 0 v_0 v0 -> v 2 v_2 v2 -> v 1 v_1 v1 6 + 10 = 16 ×
v 1 v_1 v1 -> v 0 v_0 v0 10 v 1 v_1 v1 -> v 2 v_2 v2 -> v 0 v_0 v0 4 + 5 = 9
v 1 v_1 v1 -> v 2 v_2 v2 0 v 1 v_1 v1 -> v 2 v_2 v2 -> v 1 v_1 v1 4 + 11 = 15 ×

分析过程同上,结果如下图

Floyd算法求解各顶点之间最短路径问题

  1. 如何使用这两个矩阵呢?

例如,通过A,我知道 v 0 v_0 v0 v 2 v_2 v2的最短路径长度是10,从pre可以知道,从 v 0 v_0 v0 v 2 v_2 v2需要先从 v 0 v_0 v0 v 1 v_1 v1,再从 v 1 v_1 v1 v 2 v_2 v2

6.时间复杂度和空间复杂度文章来源地址https://www.toymoban.com/news/detail-450010.html

时间复杂度 解释 空间复杂度 解释
O( ∥ V ∥ 3 \|V\|^3 V3) Floyd算法的执行过程是每次将一个顶点作为中转,|V|个顶点,需要执行|V|次相同的操作,在每次操作中,我们都需要遍历矩阵A,需要 ∥ V ∥ 2 \|V\|^2 V2的时间,所以总共需要O( ∥ V ∥ 3 \|V\|^3 V3) O( ∥ V ∥ 2 \|V\|^2 V2) 在算法执行的过程中,需要借助两个数组,A和pre,两个数组都需要 ∥ V ∥ 2 \|V\|^2 V2的空间,所以空间复杂度是O( ∥ V ∥ 2 \|V\|^2 V2)

到了这里,关于Floyd算法求解各顶点之间最短路径问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【路径规划】(2) A* 算法求解最短路,附python完整代码

    大家好,今天和各位分享一下机器人路径规划中非常经典的 A* 算法,感兴趣的点个关注,文末有 python 代码,那我么开始吧。 A* 算法是 1968 年 P.E.Hart[1]等人所提出的 在全局地图环境中所有已知情形下求解最短路径问题的方法,由于其简洁高效,容易实施 等 优点 而受到人们

    2024年02月03日
    浏览(36)
  • 【路径规划】(1) Dijkstra 算法求解最短路,附python完整代码

    好久不见,我又回来了, 这段时间把路径规划的一系列算法整理一下 ,感兴趣的点个关注。今天介绍一下机器人路径规划算法中最基础的 Dijkstra 算法,文末有 python 完整代码,那我们开始吧。 1959 年,荷兰计算机科学家 ·EdsgerWybe·Dijkstra 发表了论文《 A note on two problems in c

    2023年04月08日
    浏览(43)
  • 用栈求解迷宫问题的所有路径及最短路径程序(纯c语言)

    参考了这个博客 学校作业,在各种地方搜了半天,看别人的要么就是有点错,要么就是很复杂用了不少我不知道的库,还要么就是只求了一条路径,还要么就是用了c++没学过。 写了半天,写出了一个应该是比较简单的方法,应该是还能优化,不过作业能跑就行,懒得搞了。

    2023年04月12日
    浏览(36)
  • 数据结构学习记录——图-最短路径问题(无权图单源最短路径算法、有权图单源最短路径算法、多源最短路径算法、Dijkstra(迪杰斯特拉)算法、Floyd算法)

    目录 问题分类  无权图单源最短路径算法 思路 伪代码 时间复杂度 代码实现(C语言) 有权图单源最短路径算法 Dijkstra(迪杰斯特拉)算法 伪代码  时间复杂度  代码实现(C语言) 多源最短路径算法 两种方法 Floyd算法 代码实现(C语言) 最短路径问题的抽象 在网络中,求

    2024年02月08日
    浏览(57)
  • 数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。

    最短路径的算法有两个, Dijkstra算法 和 Floyd算法 。 Dijkstra算法 解决的是 单源 最短路径问题 。 Floyd算法解决的是 多源 最短路径问题,并且可以处理负权图 。 今天要讲的就是Dijkstra算法。 加: feng--Insist (大写的i),进java交流群讨论互联网+技术。可索要PPT等资料。 其他资料

    2024年02月11日
    浏览(51)
  • java实现迪杰斯特拉(Dijkstra)算法求解最短路问题

    迪杰斯特拉(Dijkstra)算法是由荷兰计算机科学家狄克斯特拉于1959年提出的。是寻找从一个顶点到其余各顶点的最短路径算法,可用来解决最短路径问题。 迪杰斯特拉算法采用贪心算法的策略,将所有顶点分为已标记点和未标记点两个集合,从起始点开始,不断在未标记点中寻

    2024年02月12日
    浏览(37)
  • 广度优先搜索(BFS)算法求解单源最短路径问题

      单源最短路径问题是图论中一类重要且常见的应用问题。在这个问题中,我们需要找到从一个给定源节点到其他节点的最短路径。广度优先搜索(BFS)算法是一种常用且有效的求解这一问题的算法。   本篇博客将重点讨论单源最短路径问题及其实际应用,同时简要介绍

    2024年02月13日
    浏览(45)
  • Acwing.854 Floyd求最短路 (Floyd算法)

    给定一个n个点m条边的有向图,图中可能存在重边和自环,边权可能为负数。 再给定k个询问,每个询问包含两个整数x和y,表示查询从点x到点y的最短距离,如果路径不存在,则输\\\"impossible”。 数据保证图中不存在负权回路。 第一行包含三个整数n, m, k 接下来m行,每行包含三

    2024年02月13日
    浏览(35)
  • 图算法——求最短路径(Floyd算法)

    目录 一、什么是最短路径 二、弗洛伊德(Floyd)算法 三、测试程序         求图的最短路径在实际生活中有许多应用,比如说在你在一个景区的某个景点,参观完后,要怎么走最少的路程到你想参观的下个景点,这就利用到了求图最短路径的算法。求图的最短路径有很多

    2024年02月07日
    浏览(38)
  • python实现Dijkstra算法求解最短路径问题(Shortest Path Problem)

    最短路问题(Shortest Path Problem,SPP)是 图论 的一个经典问题,其目的在于寻找网络中任意两个节点间的最短路径,这里的最短可以衍生为距离最短、费用最小、时间最短等一系列度量。当前的涌现了很多最短路径的变种,如带资源约束的最短路径问题(Shortest Path Problem wit

    2024年02月09日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包