返回顶部
首页 > 资讯 > 后端开发 > Python >最短路径算法—Floyd(弗洛伊德)算法
  • 427
分享到

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

弗洛伊德算法最短 2023-01-31 01:01:46 427人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

December 19, 2015 10:56 PM Floyd算法是解决任意两点间的最短路径的一种算法,可以正确处理带权有向图或负权的最短路径问题 解决此问题有两种方法: 其一是分别以图中每个顶点为源点共调用n次算法;

December 19, 2015 10:56 PM
Floyd算法是解决任意两点间的最短路径的一种算法,可以正确处理带权有向图或负权的最短路径问题
解决此问题有两种方法:
其一是分别以图中每个顶点为源点共调用n次算法;
其二是采用Floyd算法。
两种算法的时间复杂度均为O(n3),但后者形式上比较简单。

Floyd算法的基本思想:
1. 利用二维数组dist[i][j]记录当前vi到vj的最短路径长度,数组dist的初值等于图的带权邻接矩阵;
2. 集合S记录当前允许的中间顶点,初值S=Φ;
3. 依次向S中加入v0 ,v1… vn-1,每加入一个顶点,对dist[i][j]进行一次修正:设S={v0 ,v1… vk-1},加入vk,则dist(k)[i][j] = min{ dist(k-1)[i][j],dist(k-1)[i][k]+dist(k-1)[k][j]}。dist(k)[i][j]的含义:允许中间顶点的序号最大为k时从vi到vj的最短路径长度。
dist(n-1)[i][j]就是vi到vj的最短路径长度。
这里写图片描述

最短距离有三种情况:
1、两点的直达距离最短。
2、两点间只通过一个中间点而距离最短。
3、两点间用通过两各以上的顶点而距离最短。
对于第一种情况:
在初始化的时候就已经找出来了且以后也不会更改到。
对于第二种情况:
弗洛伊德算法的基本操作就是对于每一对顶点,遍历所有其它顶点,看看可否通过这一个顶点让这对顶点距离更短
对于第三种情况:
如下图的五边形,可先找一点(比如x,使=2),就变成了四边形问题,再找一点(比如y,使=2),可变成三角形问题了(v,u,w),也就变成第二种情况了,由此对于n边形也可以一步步转化成四边形三角形问题。(这里面不用担心哪个点要先找哪个点要后找,因为找了任一个点都可以使其变成(n-1)边形的问题)。
这里写图片描述

#Floyd.py
#王渊
#2015.12.17
#Email:wyxidian@gmail.com
from pylab import *

INFINITY = 65535                        #代表无穷大
D = array([[0,10,INFINITY,INFINITY,INFINITY,11,INFINITY,INFINITY,INFINITY],#邻接矩阵
        [10,0,18,INFINITY,INFINITY,INFINITY,16,INFINITY,12],
        [INFINITY,18,0,22,INFINITY,INFINITY,INFINITY,INFINITY,8],
        [INFINITY,INFINITY,22,0,20,INFINITY,INFINITY,16,21],
        [INFINITY,INFINITY,INFINITY,20,0,26,INFINITY,7,INFINITY],
        [11,INFINITY,INFINITY,INFINITY,26,0,17,INFINITY,INFINITY],
        [INFINITY,16,INFINITY,24,INFINITY,17,0,19,INFINITY],
        [INFINITY,INFINITY,INFINITY,16,7,INFINITY,19,0,INFINITY],
        [INFINITY,12,8,21,INFINITY,INFINITY,INFINITY,INFINITY,0]])
lengthD = len(D)                    #邻接矩阵大小
p = list(range(lengthD))
P = []
for i in range(lengthD):
    P.append(p)
P = array(P)

for i in range(lengthD):
    for j in range(lengthD):
        for k in range(lengthD):
            if(D[i,j] > D[i,k]+D[j,k]):         #两个顶点直接较小的间接路径替换较大的直接路径
                P[i,j] = P[j,k]                 #记录新路径的前驱
print(P)
print(D)

--结束END--

本文标题: 最短路径算法—Floyd(弗洛伊德)算法

本文链接: https://lsjlt.com/news/184149.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 最短路径算法—Floyd(弗洛伊德)算法
    December 19, 2015 10:56 PM Floyd算法是解决任意两点间的最短路径的一种算法,可以正确处理带权有向图或负权的最短路径问题 解决此问题有两种方法: 其一是分别以图中每个顶点为源点共调用n次算法; ...
    99+
    2023-01-31
    弗洛伊德 算法 最短
  • C++的最短路径的弗洛伊德算法案例讲解
    现在我们有这么一张图: 我们要做的是求出从某一点到达任意一点的最短距离,我们先用邻接矩阵来建图,map[i][j]表示从i点到j点的距离,把自己到自己设为0,把自己到不了的边初始化...
    99+
    2024-04-02
  • java图论弗洛伊德和迪杰斯特拉算法解决最短路径问题
    目录弗洛伊德算法算法介绍算法图解分析  迪杰斯特拉算法算法介绍算法过程 弗洛伊德算法 算法介绍 算法图解分析     第一轮循环中,以A(下标为:0)作为中间顶点 【即把作为中...
    99+
    2024-04-02
  • Java实现Floyd算法求最短路径
    本文实例为大家分享了Java实现Floyd算法求最短路径的具体代码,供大家参考,具体内容如下import java.io.FileInputStream; import java.io.FileNotFoundException; impo...
    99+
    2023-05-30
  • Floyd和dij算法计算最短路径有什么区别
    1.算法基础不同 xFloyd算法基于动态规划思想,用于求解图中所有顶点对之间的最短路径; dij算法是基于贪心思想,主要用于求解从某一源点到图中所有其他顶点的最短路径。 2.时间复杂度不同 xFloyd算法的...
    99+
    2023-10-29
    最短 有什么区别 算法
  • C#图表算法之最短路径
    目录1.最短路径的性质最短路径2.加权有向图的数据结构加权有向图边的API加权有向图的API最短路径的API最短路径的数据结构边的松弛顶点的松弛3.最短路径算法的理论基础最优性条件验...
    99+
    2024-04-02
  • python最短路径算法怎么选择
    小编给大家分享一下python最短路径算法怎么选择,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!说明解决任意两个节点之间的最短距离,用Floyd。解决单源最短路径问题,有负边时用Bellman-Ford,无负边时用Dijk...
    99+
    2023-06-20
  • python中有哪些最短路径算法
    这期内容当中小编将会给大家带来有关python中有哪些最短路径算法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、Bellman-Ford 算法Bellman-Ford算法用于求解单源最短路径问题。算法...
    99+
    2023-06-15
  • matlab最短路径算法怎么应用
    在MATLAB中,可以使用Graph and Digraph对象来实现最短路径算法。首先,你需要创建一个Graph对象,然后通过添加...
    99+
    2023-10-07
    matlab
  • java实现最短路径算法之Dijkstra算法的示例
    这篇文章主要介绍了java实现最短路径算法之Dijkstra算法的示例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、知识准备:1、表示图的数据结构用于存储图的数据结构有多...
    99+
    2023-05-31
    java dijkstra
  • 详解Dijkstra算法之最短路径问题
    目录一、最短路径问题介绍二、Dijkstra算法介绍2.1、算法特点2.2、算法的思路三、Dijkstra算法示例演示四、Dijkstra算法的代码实现(c++)一、最短路径问题介绍...
    99+
    2024-04-02
  • C++最短路径Dijkstra算法如何实现
    这篇文章主要介绍“C++最短路径Dijkstra算法如何实现”,在日常操作中,相信很多人在C++最短路径Dijkstra算法如何实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++最短路径Dijkstra...
    99+
    2023-07-05
  • python3实现Dijkstra算法最短路径的实现
    问题描述 现有一个有向赋权图。如下图所示: 问题:根据每条边的权值,求出从起点s到其他每个顶点的最短路径和最短路径的长度。 说明:不考虑权值为负的情况,否则会出现负值圈问题。 ...
    99+
    2024-04-02
  • 实现Dijkstra算法最短路径问题详解
    1、最短路径问题介绍 问题解释: 从图中的某个顶点出发到达另外一个顶点的所经过的边的权重和最小的一条路径,称为最短路径 解决问题的算法: 迪杰斯特拉算法(Dijkstra...
    99+
    2024-04-02
  • C#图表算法之最短路径怎么实现
    本篇内容主要讲解“C#图表算法之最短路径怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#图表算法之最短路径怎么实现”吧!从一个顶点到达另一个顶点的成本最小的路径。我们采用一个一般性的模...
    99+
    2023-06-30
  • python中怎么利用Dijkstra算法求最短路径
    python中怎么利用Dijkstra算法求最短路径,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。  从某源点到其余各顶点的最短路径  Dijkstra算法可用...
    99+
    2023-06-02
  • C++的最短路径怎么计算
    这篇文章主要介绍“C++的最短路径怎么计算”,在日常操作中,相信很多人在C++的最短路径怎么计算问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++的最短路径怎么计算”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-17
  • Java利用遗传算法求解最短路径问题
    目录1、问题描述2、编码3、个体类4、遗传算法解决最短路径问题主方法5、适应度6、选择算子7、交叉算子8、变异算子9、总结遗传算法(Genetic Algorithm,GA)最早是由...
    99+
    2024-04-02
  • Java如何利用遗传算法求解最短路径
    这篇“Java如何利用遗传算法求解最短路径”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java如何利用遗传算法求解最短路径...
    99+
    2023-07-01
  • Java利用Dijkstra算法求解拓扑关系最短路径
    目录算法简介代码实现思路算法思想 代码示例算法简介 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学迪家迪杰斯特拉于1959年提出的,因此又叫狄克斯特拉算法。是从一个顶...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作