python 之弗洛伊德算法

文章目录

  • 介绍
  • 代码

介绍

弗洛伊德算法,也称为Floyd-Warshall算法,是一种用于解决图中所有节点对之间的最短路径问题的动态规划算法。它可以处理带有负权边但不含负权环的加权有向图或无向图。该算法以Robert Floyd和Stephen Warshall的名字命名,于1962年分别由他们独立提出。

以下是弗洛伊德算法的详细步骤:

  1. 初始化距离矩阵:创建一个二维数组dist[][],其中dist[i][j]表示节点i到节点j的最短路径长度。如果节点i到节点j有直接连接的边,则dist[i][j]的值为这条边的权重;否则,dist[i][j]的值设为无穷大,表示不可达。

  2. 初始化对角线:将对角线上的元素dist[i][i]设为0,表示每个节点到自身的距离为0。

  3. 动态规划更新:对于每一对节点(i, j),以每个节点k作为中间节点,检查是否存在一条从节点i到节点j的路径,经过节点k可以使得路径长度更短。如果存在这样的路径,则更新dist[i][j]dist[i][k] + dist[k][j],即通过中间节点k的路径长度。如果dist[i][k] + dist[k][j]比当前已知的dist[i][j]更小,则更新dist[i][j]

  4. 重复更新:重复以上步骤,直到所有节点对之间的最短路径都被找到,并且没有更改发生。最终,dist[][]矩阵中的值就是每对节点之间的最短路径长度。

弗洛伊德算法的时间复杂度为O(n^3),其中n是图中的节点数。由于它使用了动态规划的思想,因此适用于解决小规模的图以及密集图。然而,对于大型稀疏图,可能会有更高效的算法,比如Dijkstra算法和Bellman-Ford算法,它们针对单源最短路径问题的性能更好。

代码

以下是使用Python实现弗洛伊德算法的代码示例:

INF = float('inf')def floyd_warshall(graph):# 初始化距离矩阵dist = [[INF if i != j else 0 for j in range(len(graph))] for i in range(len(graph))]# 更新距离矩阵for i in range(len(graph)):for j in range(len(graph)):if graph[i][j] != 0:  # 如果节点i和节点j之间有直接连接的边dist[i][j] = graph[i][j]# 动态规划更新距离矩阵for k in range(len(graph)):for i in range(len(graph)):for j in range(len(graph)):if dist[i][k] != INF and dist[k][j] != INF:  # 如果节点i到k和k到节点j之间有路径dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])return dist# 示例图的邻接矩阵表示
graph = [[0, 5, INF, 10],[INF, 0, 3, INF],[INF, INF, 0, 1],[INF, INF, INF, 0]
]# 打印最短路径距离矩阵
result = floyd_warshall(graph)
for row in result:print(row)

这段代码首先定义了一个INF常量,用于表示无穷大。然后实现了floyd_warshall函数,该函数接受一个邻接矩阵表示的图作为输入,并返回所有节点对之间的最短路径距离矩阵。在函数中,首先初始化距离矩阵,然后根据图的邻接矩阵更新直接连接的边的距离,接着使用动态规划的思想逐步更新距离矩阵,直到得到所有节点对之间的最短路径距离矩阵。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/681643.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#系列-C#EF框架实现增删改查(27)

在C#中,Entity Framework (EF) 是一个流行的对象关系映射器 (ORM),它使得开发者可以使用面向对象的方式来操作数据库。使用EF,你可以将数据库表映射到C#类,并使用EF提供的方法来执行数据库操作,如增加、删除、修改和查…

线性时间非比较类排序之基数排序

基数排序 基数排序是桶排序的扩展,因此又称“桶子法”,它是通过键值的部分信息,将要排序的元素分配至某些“桶”中,以达到排序的作用。 1. 算法思想 将各元素按位数切割成不同的数字,然后分别根据每个位数的比较结果…

【设计模式】springboot3项目整合模板方法深入理解设计模式之模板方法(Template Method)

🎉🎉欢迎光临🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟特别推荐给大家我的最新专栏《Spring 狂野之旅:底层原理高级进阶》 &#x1f680…

C#使用密封类密封用户信息

目录 一、涉及到的知识点 1.密封类定义 2.何时使用密封类 3.使用密封类的注意事项 二、实例1 三、实例2 1.源码 2.生成效果 在C#中,密封类(sealed class)是一种不能被其他类继承的类。它用于防止其他类继承它的功能和属性。 一、涉…

深度解析 Netty 架构与原理

一共 28661字,耐心看完。 在阅读本文前最好有 Java 的 IO 编程经验(知道 Java 的各种 IO 流),以及 Java 网络编程经验(用 ServerSocket 和 Socket 写过 demo),并对 Java NIO 有基本的认识&…

挖掘嵌入式系统在物联网和智能设备中的应用潜力

1. 物联网的发展和嵌入式系统 介绍物联网的定义和特点,以及其在各个领域中的应用。探讨物联网对嵌入式系统的需求,包括低功耗、小型化、实时性等特性,以及对嵌入式系统的数据处理和通信能力的要求。 2. 嵌入式系统在智能设备中的应用 分析…

linux---内存管理

一 虚拟内存 即使是现代操作系统中,内存依然是计算机中很宝贵的资源,看看你电脑几个T固态硬盘,再看看内存大小就知道了。 为了充分利用和管理系统内存资源,Linux采用虚拟内存管理技术,利用虚拟内存技术让每个进程都有…

计算机网络——09Web-and-HTTP

Web and HTTP 一些术语 Web页:由一些对象组成对象可以是HTML文件、JPEG图像,JAVA小程序,声音剪辑文件等Web页含有一个基本的HTML文件,该基本HTML文件又包含若干对象的引用(链接)通过URL对每个对象进行引用…

权限提升:利用Linux错配提权

目录 Linux权限基础 Linux用户权限 Linux文件权限 特殊的Linux文件权限 Linux本机信息收集 Linux错配提权 crontab计划任务提权 SUID提权 Linux权限基础 Linux用户权限 在Linux中,根据权限的不同,大致可以分为三种:超级用户&#x…

npm install 安装依赖如何加速

在使用npm安装依赖时,有几种方法可以加速这一过程,尤其是在面临网络限制或npm官方源速度慢的情况下。以下是一些常用的加速技巧: 1. 使用国内镜像源 国内有几个镜像源可以提供更快的下载速度,例如淘宝npm镜像。你可以通过以下命…

通过QT制作一个模仿微信主界面的界面(不要求实现具体通信功能)

main.cpp #include "widget.h" #include "second.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();//实例化第二个界面Second s;QObject::connect(&w, &Widget::my_jump, &…

Linux线程库封装

一 MyThread.hpp #pragma once #include<pthread.h> #include<iostream> #include<unistd.h> #include<string> #include<ctime>typedef void (*callback_t)(); static int num 1; //任务和线程绑定 class Thread {static void* Routine(void …

力扣精选算法100道——矩阵区域和 (前缀和专题)

目录 &#x1f388;了解题意 &#x1f388;算法原理 &#x1f388;实现代码 &#x1f388;了解题意 给定一个大小为 m x n 的矩阵 mat 和一个整数 k&#xff0c;你需要计算一个新的矩阵 answer&#xff0c;其中每个 answer[i][j] 表示矩阵 mat 中以坐标 (i, j) 为中心、边…

django中查询优化

在Django中&#xff0c;查询优化是一个重要的主题&#xff0c;因为不正确的查询可能会导致性能问题&#xff0c;尤其是在处理大量数据时。以下是一些在Django中进行查询优化的建议&#xff1a; 一&#xff1a;使用select_related和prefetch_related: select_related用于优化一…

2024年华为OD机试真题-攀登者1-Python-OD统一考试(C卷)

题目描述: 攀登者喜欢寻找各种地图,并且尝试攀登到最高的山峰。 地图表示为一维数组,数组的索引代表水平位置,数组的高度代表相对海拔高度。其中数组元素0代表地面。 例如[0,1,2,4,3,1,0,0,1,2,3,1,2,1,0], 代表如下图所示的地图,地图中有两个山脉位置分别为 1,2,3,4,5和8…

pwn学习笔记(3)ret2syscall

pwn学习笔记&#xff08;3&#xff09; ROP原理&#xff1a; ​ ROP(Return Oriented Programming)返回导向编程&#xff0c;主要思想是通过在程序中已有的小片段&#xff08;gadgets&#xff09;来改变某些寄存器或者变量的值&#xff0c;从而控制程序的执行流程。 栈溢出–…

论文阅读-Pegasus:通过网络内一致性目录容忍分布式存储中的偏斜工作负载

论文名称&#xff1a;Pegasus: Tolerating Skewed Workloads in Distributed Storage with In-Network Coherence Directories 摘要 高性能分布式存储系统面临着由于偏斜和动态工作负载引起的负载不平衡的挑战。本文介绍了Pegasus&#xff0c;这是一个利用新一代可编程交换机…

C语言静态库深入剖析

在C语言编程实践中&#xff0c;库是代码复用和模块化开发的重要基础结构。静态库作为其中一种主要的库类型&#xff0c;其内容在编译链接阶段即被完整地嵌入到最终生成的可执行文件中&#xff0c;从而使得程序在运行时无需外部依赖。本篇博客将系统性、详细地剖析C语言静态库的…

CSS 评分器星星效果

<template><view class="rating"><!-- 5颗星 --><input value="5" name="rating" id="star5" type="radio"><label for="star5"></label><!-- 4颗星 --><input val…

【后端高频面试题--设计模式下篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;后端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 后端高频面试题--设计模式下篇 后端高频面试题--设计模式上篇设计模式总览模板方法模式怎么理解模…