当前位置: 首页 > article >正文

Floyd算法:动态规划解最短路径

Floyd 算法概述Floyd 算法是一种用于求解图中所有顶点对之间最短路径的动态规划算法。该算法由 Robert Floyd 在 1962 年提出适用于有向图或无向图允许边权为负值但不能存在负权回路。Floyd 算法的核心思想是通过逐步优化路径来更新最短距离矩阵。算法核心思想Floyd 算法通过三重循环动态更新距离矩阵。假设图中有 ( n ) 个顶点算法的基本思路是对于每一对顶点 ( (i, j) )检查是否存在一个中间顶点 ( k )使得从 ( i ) 到 ( j ) 的路径经过 ( k ) 后路径更短。如果是则更新距离矩阵中的值。算法步骤初始化距离矩阵创建一个 ( n \times n ) 的矩阵 ( D )其中 ( D[i][j] ) 表示顶点 ( i ) 到顶点 ( j ) 的直接距离。如果 ( i ) 和 ( j ) 之间没有直接边则 ( D[i][j] \infty )。对于 ( i j )( D[i][j] 0 )。动态更新距离矩阵对于每一个中间顶点 ( k )从 1 到 ( n )遍历所有顶点对 ( (i, j) )检查是否存在通过 ( k ) 的更短路径。即[ D[i][j] \min(D[i][j], D[i][k] D[k][j]) ]如果 ( D[i][k] D[k][j] ) 比当前的 ( D[i][j] ) 小则更新 ( D[i][j] )。输出最终结果完成所有中间顶点的遍历后矩阵 ( D ) 中的 ( D[i][j] ) 即为顶点 ( i ) 到顶点 ( j ) 的最短距离。算法实现以下是 Floyd 算法的 C 实现代码#include iostream #include vector #include climits using namespace std; const int INF INT_MAX; void floydWarshall(vectorvectorint graph, int n) { vectorvectorint dist(n, vectorint(n)); // 初始化距离矩阵 for (int i 0; i n; i) { for (int j 0; j n; j) { dist[i][j] graph[i][j]; } } // 动态更新距离矩阵 for (int k 0; k n; k) { for (int i 0; i n; i) { for (int j 0; j n; j) { if (dist[i][k] ! INF dist[k][j] ! INF dist[i][k] dist[k][j] dist[i][j]) { dist[i][j] dist[i][k] dist[k][j]; } } } } // 输出最短距离矩阵 cout 最短距离矩阵 endl; for (int i 0; i n; i) { for (int j 0; j n; j) { if (dist[i][j] INF) { cout INF ; } else { cout dist[i][j] ; } } cout endl; } } int main() { int n 4; vectorvectorint graph { {0, 5, INF, 10}, {INF, 0, 3, INF}, {INF, INF, 0, 1}, {INF, INF, INF, 0} }; floydWarshall(graph, n); return 0; }算法复杂度分析Floyd 算法的时间复杂度为 ( O(n^3) )其中 ( n ) 是图中顶点的数量。这是因为算法需要三重循环遍历所有顶点对和中间顶点。空间复杂度为 ( O(n^2) )用于存储距离矩阵。算法正确性证明Floyd 算法的正确性基于动态规划的最优子结构性质。假设 ( D_k[i][j] ) 表示从顶点 ( i ) 到顶点 ( j ) 且中间顶点编号不超过 ( k ) 的最短路径长度。算法的递推关系为[ D_k[i][j] \min(D_{k-1}[i][j], D_{k-1}[i][k] D_{k-1}[k][j]) ]通过逐步优化最终得到的 ( D_n[i][j] ) 即为全局最短路径。算法应用场景Floyd 算法适用于以下场景需要求解图中所有顶点对之间的最短路径。图的规模较小顶点数不超过几百因为 ( O(n^3) ) 的复杂度在大规模图中效率较低。图中允许存在负权边但不能有负权回路。算法优缺点优点可以处理负权边但不能有负权回路。代码实现简单易于理解。适用于稠密图尤其是需要多次查询任意两点间最短路径的场景。缺点时间复杂度较高不适用于大规模图。空间复杂度较高需要存储 ( n \times n ) 的矩阵。算法优化虽然 Floyd 算法的时间复杂度难以进一步降低但在某些情况下可以通过以下方式优化提前终止如果在某次迭代中距离矩阵未发生任何更新可以提前终止算法。并行化利用多线程或 GPU 加速三重循环的计算。与其他最短路径算法的比较Dijkstra 算法适用于单源最短路径问题时间复杂度为 ( O((V E) \log V) )使用优先队列。不能处理负权边。在稀疏图中效率高于 Floyd 算法。Bellman-Ford 算法适用于单源最短路径问题可以检测负权回路。时间复杂度为 ( O(VE) )效率低于 Dijkstra 算法。Floyd 算法适用于所有顶点对的最短路径问题。可以处理负权边但不能有负权回路。在稠密图中表现较好。负权回路检测Floyd 算法可以通过检查距离矩阵的主对角线来检测负权回路。如果在算法结束后存在 ( D[i][i] 0 )则说明图中存在负权回路。路径重建如果需要记录最短路径的具体路径可以引入一个路径矩阵 ( P )其中 ( P[i][j] ) 表示从 ( i ) 到 ( j ) 的最短路径的中间顶点。以下是路径重建的实现void floydWarshallWithPath(vectorvectorint graph, int n) { vectorvectorint dist(n, vectorint(n)); vectorvectorint next(n, vectorint(n, -1)); // 初始化距离矩阵和路径矩阵 for (int i 0; i n; i) { for (int j 0; j n; j) { dist[i][j] graph[i][j]; if (graph[i][j] ! INF i ! j) { next[i][j] j; } } } // 动态更新距离矩阵和路径矩阵 for (int k 0; k n; k) { for (int i 0; i n; i) { for (int j 0; j n; j) { if (dist[i][k] ! INF dist[k][j] ! INF dist[i][k] dist[k][j] dist[i][j]) { dist[i][j] dist[i][k] dist[k][j]; next[i][j] next[i][k]; } } } } // 输出最短路径 cout 最短路径 endl; for (int i 0; i n; i) { for (int j 0; j n; j) { if (i ! j next[i][j] ! -1) { cout 从 i 到 j 的路径; int u i; cout u; while (u ! j) { u next[u][j]; cout - u; } cout endl; } } } }实际应用示例以下是一个具体的图例展示 Floyd 算法的运行过程初始图顶点0, 1, 2, 3边权(0, 1): 5(0, 3): 10(1, 2): 3(2, 3): 1初始距离矩阵 [ \begin{bmatrix} 0 5 \infty 10 \ \infty 0 3 \infty \ \infty \infty 0 1 \ \infty \infty \infty 0 \ \end{bmatrix} ]运行 Floyd 算法后的距离矩阵 [ \begin{bmatrix} 0 5 8 9 \ \infty 0 3 4 \ \infty \infty 0 1 \ \infty \infty \infty 0 \ \end{bmatrix} ]总结Floyd 算法是一种经典的最短路径算法适用于求解所有顶点对之间的最短路径问题。虽然其时间复杂度较高但在小规模图或需要频繁查询任意两点间最短路径的场景中表现良好。算法的实现简单且能够处理负权边是一种非常实用的工具。

相关文章:

Floyd算法:动态规划解最短路径

Floyd 算法概述Floyd 算法是一种用于求解图中所有顶点对之间最短路径的动态规划算法。该算法由 Robert Floyd 在 1962 年提出,适用于有向图或无向图,允许边权为负值,但不能存在负权回路。Floyd 算法的核心思想是通过逐步优化路径来更新最短距…...

PDF-Extract-Kit-1.0效果实测:PDF中带颜色/阴影/透明度的公式完美还原

PDF-Extract-Kit-1.0效果实测:PDF中带颜色/阴影/透明度的公式完美还原 1. 引言:PDF公式提取的痛点与曙光 处理过学术论文或技术文档的朋友都知道,从PDF里提取公式是个老大难问题。普通的OCR工具对付文字还行,一遇到复杂的数学公…...

开篇:为什么选择Flask搭建大模型API?

001、开篇:为什么选择Flask搭建大模型API? 上周深夜调试一个生产环境的问题,客户的大模型接口在并发请求时频繁超时。团队里有人提议上异步框架,有人建议加负载均衡,我盯着日志里那几行熟悉的Werkzeug输出,突然意识到——问题不在框架,而在我们怎么用它。这让我想起很多…...

SPIRAN ART SUMMONER镜像免配置优势:预置Pyrefly HUD动画资源包即开即用

SPIRAN ART SUMMONER镜像免配置优势:预置Pyrefly HUD动画资源包即开即用 1. 引言:当AI艺术创作告别繁琐配置 想象一下,你有一个绝妙的创意画面在脑海中浮现——一位身着水晶铠甲的女战士,站在被幻光虫点亮的远古祭坛上。你迫不及…...

Qwen3-4B-Instruct部署教程:GPU温度监控+过热降频保护策略配置

Qwen3-4B-Instruct部署教程:GPU温度监控过热降频保护策略配置 1. 模型介绍与部署准备 Qwen3-4B-Instruct-2507是Qwen3系列的端侧/轻量旗舰模型,原生支持256K token(约50万字)上下文窗口,可扩展至1M token&#xff0c…...

突破Windows版本限制:Docker Desktop替代方案全解析

1. 为什么Windows用户需要Docker替代方案 很多开发者第一次在Windows电脑上安装Docker Desktop时,都会遇到那个令人头疼的提示:"Docker Desktop requires Windows 10 Pro or Enterprise version 15063 to run"。这个限制把大量使用Windows家庭…...

从零到一:用Qwen3-VL-2B搭建智能图片分析系统,完整教程

从零到一:用Qwen3-VL-2B搭建智能图片分析系统,完整教程 1. 引言 你有没有遇到过这样的场景? 看到一张复杂的图表,想快速提取里面的关键数据,却要自己手动整理收到一堆产品图片,需要批量识别里面的文字信…...

别再手写DFS遍历语法树了!用Tree-sitter Query像写SQL一样精准定位代码节点(Python实战)

用Tree-sitter Query像写SQL一样精准定位代码节点(Python实战) 当你需要从代码库中批量提取所有函数调用、特定赋值语句或错误节点时,是否还在手动编写递归遍历算法?传统方式不仅需要处理复杂的回溯逻辑,还要应对各种边…...

从QPushButton的clicked到窗口关闭:手把手调试一个Qt信号槽连接(避坑指南)

从QPushButton的clicked到窗口关闭:Qt信号槽连接调试实战指南 在Qt开发中,信号槽机制是实现对象间通信的核心技术,看似简单的connect语句背后却隐藏着许多容易踩坑的细节。很多开发者都遇到过这样的场景:明明按照文档正确编写了信…...

PyTorch加载.pth预训练模型,别再傻傻等下载了!3种离线下载+加载避坑指南

PyTorch预训练模型离线加载实战:3种高效方案与避坑指南 当你兴奋地运行PyTorch示例代码准备调用预训练模型时,突然弹出的网络超时错误就像一盆冷水浇下来。这种场景在国内开发者中太常见了——不是技术门槛高,而是网络环境成了拦路虎。本文将…...

收藏!从「外挂」到「脑子」一文读懂LLM Agent进化逻辑,小白也能看懂大模型

本文介绍了上交大和中科院团队的综述论文《Externalization in LLM Agents》,提出大模型Agent的核心进化在于将认知负担从模型中"搬出去",即通过外化记忆、技能和协议来提升可靠性。文章将Agent发展分为三个时代:能力在权重里、能力…...

Python异步生成器与async for的内部工作机制

Python异步编程近年来已成为处理高并发场景的利器,其中异步生成器与async for的组合更是实现了高效的数据流处理。当传统生成器遇上async/await语法,它们如何协同工作?其内部机制隐藏着怎样的设计智慧?本文将深入剖析这一技术组合…...

Three.js 工程向:资源生命周期管理与显存回收实践

文章目录一、为什么会出现“越跑越卡”二、必须关注的释放对象三、工程化回收流程四、排障建议五、结语一、为什么会出现“越跑越卡” Three.js 项目长期运行后帧率下降,常见原因是纹理、几何体、材质未及时释放。 二、必须关注的释放对象 geometry.dispose()mat…...

Three.js 工程向:后处理性能预算与多 Pass 链路优化

文章目录一、后处理为什么容易超预算二、常见性能热点三、优化策略四、工程实践五、结语一、后处理为什么容易超预算 全屏 Pass 叠加会快速放大带宽与采样成本,尤其在高分辨率设备上。 二、常见性能热点 Bloom、DOF、SSR 等重采样效果。多个 Pass 串联导致多次全…...

bge-large-zh-v1.5实战应用:快速搭建智能文档检索系统

bge-large-zh-v1.5实战应用:快速搭建智能文档检索系统 1. 引言:为什么选择bge-large-zh-v1.5 在日常工作中,我们经常需要从海量文档中快速找到相关信息。传统的关键词匹配方式已经无法满足精准检索的需求,而基于语义理解的智能检…...

nli-MiniLM2-L6-H768应用落地:电商评论情感推理与法律条款矛盾检测实战

nli-MiniLM2-L6-H768应用落地:电商评论情感推理与法律条款矛盾检测实战 1. 模型简介与核心优势 nli-MiniLM2-L6-H768是一个专为自然语言推理(NLI)与零样本分类设计的轻量级交叉编码器(Cross-Encoder)模型。它在保持高性能的同时,提供了更小的模型体积和…...

10分钟实现魔兽争霸3现代化改造:WarcraftHelper深度配置指南

10分钟实现魔兽争霸3现代化改造:WarcraftHelper深度配置指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 在现代高分辨率显示器上重温经…...

为什么92%的GraalVM项目在生产环境OOM?揭秘Class Initialization Order陷阱与@AutomaticFeature强制预热方案

第一章:GraalVM静态镜像OOM现象的全局洞察GraalVM静态镜像(Native Image)在构建无JVM运行时的高性能原生可执行文件时,常因堆内存配置失当或元数据膨胀引发运行时OOM(Out of Memory)异常。此类OOM并非传统J…...

MelonLoader终极指南:15分钟解锁Unity游戏Mod无限可能

MelonLoader终极指南:15分钟解锁Unity游戏Mod无限可能 【免费下载链接】MelonLoader The Worlds First Universal Mod Loader for Unity Games compatible with both Il2Cpp and Mono 项目地址: https://gitcode.com/gh_mirrors/me/MelonLoader 还在为Unity游…...

如何快速掌握COBRA工具箱:基因组尺度代谢网络分析的完整指南

如何快速掌握COBRA工具箱:基因组尺度代谢网络分析的完整指南 【免费下载链接】cobratoolbox The COnstraint-Based Reconstruction and Analysis Toolbox. Documentation: 项目地址: https://gitcode.com/gh_mirrors/co/cobratoolbox COBRA工具箱&#xff0…...

mysql如何配置大页内存_mysql large-pages开启方法

MySQL启用large-pages失败主因是内核未配vm.nr_hugepages、limits.conf未设memlock、systemd覆盖ulimit或mysqld非root/CAP_IPC_LOCK权限启动;需依次配置sysctl、limits、service文件,并在[mysqld]段写large-pages(无等号)&#x…...

nli-MiniLM2-L6-H768惊艳效果展示:630MB模型精准识别蕴含/矛盾/中立关系

nli-MiniLM2-L6-H768惊艳效果展示:630MB模型精准识别蕴含/矛盾/中立关系 1. 引言:小身材大能量的自然语言推理专家 在自然语言处理领域,判断两个句子之间的关系一直是个有趣且实用的挑战。想象一下,当我们需要判断"一个人正…...

Wan2.2-I2V-A14B快速部署:在ComfyUI中一键安装,开箱即用

Wan2.2-I2V-A14B快速部署:在ComfyUI中一键安装,开箱即用 1. 引言:轻量级视频生成新选择 你是否正在寻找一款能在消费级显卡上流畅运行的视频生成工具?Wan2.2-I2V-A14B作为通义万相开源的轻量级视频生成模型,凭借50亿…...

Hunyuan-HY-MT1.5-1.8B实战:REST API封装详细教程

Hunyuan-HY-MT1.5-1.8B实战:REST API封装详细教程 你是不是也遇到过这样的问题:手头有个效果不错的翻译模型,但团队里前端、测试、产品同学都不会写Python,每次调用都要找你跑脚本?或者想把翻译能力集成进现有系统&am…...

DeepAnalyze与Vue.js集成:构建数据分析仪表盘

DeepAnalyze与Vue.js集成:构建数据分析仪表盘 1. 引言 想象一下这样的场景:你的团队刚刚使用DeepAnalyze完成了一项复杂的数据分析任务,生成了包含关键洞察的专业报告。但现在面临一个新的挑战——如何让这些分析结果以直观、交互的方式呈现…...

FLUX.1-Krea-Extracted-LoRA快速试用:3个高转化率电商提示词模板分享

FLUX.1-Krea-Extracted-LoRA快速试用:3个高转化率电商提示词模板分享 1. 模型介绍与核心价值 FLUX.1-Krea-Extracted-LoRA是从FLUX.1-Krea-dev基础模型中提取的LoRA风格权重,专为FLUX.1-dev设计。这个模型最大的特点是能够显著减少AI生成图像常见的&qu…...

文墨共鸣快速上手:3步部署水墨风语义相似度AI,零基础也能玩转

文墨共鸣快速上手:3步部署水墨风语义相似度AI,零基础也能玩转 1. 引言:当算法遇上水墨,文字有了温度 你有没有过这样的经历?写完一段文案,想看看和另一篇稿子是不是一个意思;或者收到两份报告…...

nli-MiniLM2-L6-H768真实效果:医疗问诊记录在‘症状/用药/检查/随访’标签下的高置信识别

nli-MiniLM2-L6-H768真实效果:医疗问诊记录在症状/用药/检查/随访标签下的高置信识别 1. 模型与工具介绍 1.1 什么是nli-MiniLM2-L6-H768 nli-MiniLM2-L6-H768是一个轻量级的自然语言推理(NLI)模型,基于微软MiniLM架构开发。这个模型仅有6层Transform…...

幻境·流金开源镜像部署教程:适配RTX4090/A100的显存优化方案

幻境流金开源镜像部署教程:适配RTX4090/A100的显存优化方案 “流光瞬息,影画幻成。” 1. 引言:为什么选择幻境流金? 如果你正在寻找一个能够快速生成高清图像,同时又具备专业级画质的AI创作工具,那么幻境流…...

协议解析器生成:从协议描述自动生成解析代码

协议解析器生成:从协议描述自动生成解析代码 在通信领域,协议解析是数据交换的核心环节。传统的手动编写解析代码不仅耗时耗力,还容易因协议变更导致频繁修改。协议解析器生成技术应运而生,它能够根据协议描述自动生成高效、准确…...