新闻详情

新闻详情

首页 / 资讯中心 / 详情

【图论算法】Floyd-Warshall多源最短路算法

发布时间:2026/10/1 20:00:00来源:尧图网络
【图论算法】Floyd-Warshall多源最短路算法
一、算法简介Floyd-Warshall弗洛伊德算法是图论中经典的多源最短路径算法区别于Dijkstra单源最短路算法该算法可以一次性求出图中任意两个顶点之间的最短距离。核心特点适用场景无负权环的有向图/无向图支持负权边时间复杂度$$O(n^3)$$n为顶点数适合小规模图顶点数≤100优势代码极简、无需多次迭代一次计算得到所有点对最短路劣势时间复杂度较高不适合大规模图二、算法核心原理Floyd算法的核心思想是动态规划枚举中间节点k判断 i→k→j 的路径是否比 i→j 直接路径更短不断松弛更新最短距离。状态转移公式$$dist[i][j] min(dist[i][j], dist[i][k] dist[k][j])$$三层循环释义最外层k枚举所有可中转的中间顶点中层i枚举起点内层j枚举终点三、完整可运行代码本次代码实现4个顶点的有向图手动构建边权求解所有顶点对的最短路径兼容超大值无穷大处理可直接复制编译运行。#include stdio.h #include limits.h #define MAX_V 100 // 最大顶点数 #define INF (INT_MAX / 2) // 无穷大避免相加溢出 int graph[MAX_V][MAX_V]; // 原图邻接矩阵 int dist[MAX_V][MAX_V]; // 存储最终最短路距离矩阵 // Floyd-Warshall核心算法 void floyd_warshall(int n) { // 1. 初始化距离矩阵复制原图权值 for (int i 0; i n; i) { for (int j 0; j n; j) { dist[i][j] graph[i][j]; } } // 2. 三重循环松弛更新最短路 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] dist[k][j] dist[i][j]) { dist[i][j] dist[i][k] dist[k][j]; } } } } } int main(void) { int n 4; // 顶点数量 // 初始化邻接矩阵自身到自身距离为0其余为无穷大 for (int i 0; i n; i) { for (int j 0; j n; j) { graph[i][j] (i j) ? 0 : INF; } } // 手动赋值图的边权 graph[0][1] 5; graph[0][3] 10; graph[1][2] 3; graph[2][3] 1; // 执行Floyd算法 floyd_warshall(n); // 打印所有顶点对最短距离 printf(所有顶点对最短距离矩阵\n); for (int i 0; i n; i) { for (int j 0; j n; j) { if (dist[i][j] INF) printf(∞\t); else printf(%d\t, dist[i][j]); } printf(\n); } return 0; }四、代码细节详解1. 无穷大INF定义代码中使用INT_MAX / 2作为无穷大而非直接用INT_MAX目的是防止两个无穷大数值相加导致int溢出报错是Floyd算法的经典避坑写法。2. 邻接矩阵初始化规则顶点自身到自身距离为 0无直接相连的两个顶点距离为 INF无穷大有直接边连接的顶点赋值为对应边权3. 松弛操作核心通过中间节点k不断优化i到j的路径如果i→k→j的路径长度小于i→j直达路径就更新最短距离。三层循环顺序固定不可调换k、i、j顺序。五、测试用例图结构本次测试构建4节点有向图边关系如下0 → 1 权值 50 → 3 权值 101 → 2 权值 32 → 3 权值 1最优路径举例0→1→2→3 总权值 5319比直达0→310更短算法会自动优化该路径。六、运行结果展示编译运行代码后输出结果如下所有顶点对最短距离矩阵 0 5 8 9 ∞ 0 3 4 ∞ ∞ 0 1 ∞ ∞ ∞ 0结果解析第1行顶点0出发0到15、0到28、0到39优化后最短路径第2行顶点1出发1到23、1到341→2→3第3行顶点2出发2到31无连通路径显示 ∞七、常见问题与注意事项溢出问题严禁直接使用INT_MAX作为INF相加会造成整型溢出负权环判断若最终dist[i][i] 0说明图中存在负权环适用范围顶点数超过100不建议使用推荐Dijkstra、SPFA算法循环顺序必须先枚举中间节点k再枚举起点i、终点j八、总结Floyd-Warshall算法凭借极简的代码逻辑成为小规模图多源最短路的首选算法。虽然时间复杂度较高但无需复杂的数据结构、无需遍历邻接表仅通过邻接矩阵三重循环即可实现非常适合算法入门、课程作业、小规模场景使用。往期推荐Dijkstra单源最短路算法、SPFA负权最短路算法、最小生成树Kruskal算法
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

霍夫丁不等式手推全解析:从马尔可夫不等式到指数衰减上界 2026/10/2 2:12:00

霍夫丁不等式手推全解析:从马尔可夫不等式到指数衰减上界

1. 这不是教科书里的“证明”,而是你真正能看懂、能复现的霍夫丁不等式推导全过程霍夫丁不等式(Hoeffding Inequality)这几个字,最近在机器学习理论课、算法岗面试题、甚至强化学习论文附录里频繁刷屏。但凡翻过《Foundations of …

阅读更多 →
AI-For-Beginners 课程翻译贡献指南:从命名规范到测验本地化的完整实践 2026/10/2 2:11:54

AI-For-Beginners 课程翻译贡献指南:从命名规范到测验本地化的完整实践

教程人工智能机器学习深度学习 【免费下载链接】AI-For-Beginners 12 Weeks, 24 Lessons, AI for All! 项目地址: https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners 点击查看 免费下载 本指南以 AI-For-Beginners 课程仓库中的 翻译贡献说明(孟…

阅读更多 →
Lemlist 冷邮件外展集成指南:基于 marketingskills 零依赖 Node.js CLI 的 Agent 自动化实战 2026/10/2 2:11:53

Lemlist 冷邮件外展集成指南:基于 marketingskills 零依赖 Node.js CLI 的 Agent 自动化实战

AI 技能人工智能 【免费下载链接】marketingskills Marketing skills for Claude Code and AI agents. CRO, copywriting, SEO, analytics, and growth engineering. 项目地址: https://gitcode.com/GitHub_Trending/mar/marketingskills 点击查看 免费下载 本篇技…

阅读更多 →
深度学习rPPG心率估计:从人脸视频到非接触心率监测 2026/10/2 2:11:53

深度学习rPPG心率估计:从人脸视频到非接触心率监测

简介:面向基于 rPPG 的深度学习心率估计任务,这份 MATLAB 源码包集成了多种经典算法与可运行案例数据。适用于计算机、电子信息工程、数学等专业的课程设计、期末大作业及毕业设计,也适合研究者快速复现和扩展实验。包内共 118 个文件&#x…

阅读更多 →
基于深度学习的rPPG心率估计实战:从原理到部署全解析 2026/10/2 2:11:53

基于深度学习的rPPG心率估计实战:从原理到部署全解析

简介:基于深度学习的rPPG心率估计MATLAB实现包,面向计算机、电子信息工程、数学等专业本科生及研究生,适用于课程设计、期末大作业与毕业设计,也可作为生物医学信号处理方向研究者的算法参考。包内共118个文件,以m脚本…

阅读更多 →
等保合规下的日志审计:Power_V部署与运维避坑指南 2026/10/2 2:11:40

等保合规下的日志审计:Power_V部署与运维避坑指南

简介:网御安全系统 Power V 功能使用手册(VERSION 3.0)是北京网御星云针对防火墙、UTM、IPS及AV等安全网关产品线发布的官方功能指南,内容覆盖复杂功能与典型应用场景,适合网络管理员、安全运维人员以及有一定网络基础…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉