使用Floyd算法求解两点间最短距离

Floyd算法

Floyd算法又称为Floyd-Warshell算法,其实Warshell算法是离散数学中求传递闭包的算法,两者的思想是一致的。Floyd算法是求解多源最短路时通常选用的算法,经过一次算法即可求出任意两点之间的最短距离,并且可以处理有负权边的情况(但无法处理负权环),算法的时间复杂度是 O ( n 3 ) O(n^3) O(n3),空间复杂度是 O ( n 2 ) O(n^2) O(n2)。

python 复制代码
import numpy as np


def floyd(adjacent_matrix, source, target):
   """
   :param adjacent_matrix: 图邻接矩阵
   :param source:  起点
   :param target:  终点
   :return: shortest_path
   """
   num_node = len(adjacent_matrix)

   # 计算
   """
   矩阵D记录顶点间的最小路径
   例如D[0][3]= 10,说明顶点0 到 3 的最短路径为10;
   矩阵P记录顶点间最小路径中的中转点
   例如P[0][3]= 1 说明,0 到 3的最短路径轨迹为:0 -> 1 -> 3。
   """
   distance = np.zeros(shape=(num_node, num_node), dtype=np.int_)
   path = np.zeros(shape=(num_node, num_node), dtype=np.int_)
   for v in range(num_node):
       for w in range(num_node):
           distance[v][w] = adjacent_matrix[v][w]
           path[v][w] = w

   # 弗洛伊德算法的核心部分
   for k in range(num_node):  # k为中间点
       for v in range(num_node):  # v 为起点
           for w in range(num_node):  # w为起点
               if distance[v][w] > (distance[v][k] + distance[k][w]):
                   distance[v][w] = distance[v][k] + distance[k][w]
                   path[v][w] = path[v][k]

   print(np.asarray(path))
   shortest_path = [source]
   k = path[source][target]
   while k != target:
       shortest_path.append(k)
       k = path[k][target]
   shortest_path.append(target)
   return shortest_path


if __name__ == "__main__":
   M = 1e6
   adjacent_matrix = [
       [0, 12, M, M, M, 16, 14],
       [12, 0, 10, M, M, 7, M],
       [M, 10, 0, 3, 5, 6, M],
       [M, M, 3, 0, 4, M, M],
       [M, M, 5, 4, 0, 2, 8],
       [16, 7, 6, M, 2, 0, 9],
       [14, M, M, M, 8, 9, 0],
   ]
   shortest_path = floyd(adjacent_matrix, 0, 3)
   print(shortest_path)
   # [0, 6, 3, M, M, M],
   # [6, 0, 2, 5, M, M],
   # [3, 2, 0, 3, 4, M],
   # [M, 5, 3, 0, 5, 3],
   # [M, M, 4, 5, 0, 5],
   # [M, M, M, 3, 5, 0]

适应场景

Floyd-Warshall算法由于其 O ( n 3 ) O(n^3) O(n3)的时间复杂度,适用于节点数比较少且图比较稠密的情况。对于边数较少的稀疏图,使用基于边的算法(如Dijkstra或Bellman-Ford)通常会更高效。

相关推荐
Narutolxy27 分钟前
Python 单元测试:深入理解与实战应用20240919
python·单元测试·log4j
Amo Xiang1 小时前
2024 Python3.10 系统入门+进阶(十五):文件及目录操作
开发语言·python
liangbm31 小时前
数学建模笔记——动态规划
笔记·python·算法·数学建模·动态规划·背包问题·优化问题
B站计算机毕业设计超人1 小时前
计算机毕业设计Python+Flask微博情感分析 微博舆情预测 微博爬虫 微博大数据 舆情分析系统 大数据毕业设计 NLP文本分类 机器学习 深度学习 AI
爬虫·python·深度学习·算法·机器学习·自然语言处理·数据可视化
羊小猪~~1 小时前
深度学习基础案例5--VGG16人脸识别(体验学习的痛苦与乐趣)
人工智能·python·深度学习·学习·算法·机器学习·cnn
waterHBO3 小时前
python 爬虫 selenium 笔记
爬虫·python·selenium
编程零零七4 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
AIAdvocate6 小时前
Pandas_数据结构详解
数据结构·python·pandas
小言从不摸鱼6 小时前
【AI大模型】ChatGPT模型原理介绍(下)
人工智能·python·深度学习·机器学习·自然语言处理·chatgpt
FreakStudio8 小时前
全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类
python·嵌入式·面向对象·电子diy