对于floyed算法过程的理解
floyed应该是大家接触最短路首先了解到的算法简单的四行代码却能把所有点对之间的最短距离求出来相信很多人刚刚接触到这个算法时没有深刻理解算法的原理~~~我写这篇文章是源于南宁区域赛热身赛的一道题目由于对此算法理解不透彻比赛时候没有能将一道变形题做出来于是比赛结束后再次思考了这个算法得到了一些收获于是写下了这篇文章~~for(int k1;kn;k) for(int i1;in;i) for(int j1;jn;j) dp[i][j]min(dp[i][j],dp[i][k]dp[k][j]);主要的操作对点的松弛操作很容易理解给人咋一看的感觉就是对于每一个点对之间对于所有点都松弛一边但算法的正确性却并不是那么容易的证明~首先引入这样一种请况对于一张图已知原图中各个点对之间的最短距离现在加入一个新的点和与该图相连的若干边求加入之后新图各个点对之间的最短距离。首先对于新加的点我们可以在新图跑一边最短路求出该点到原集合中每一个点的最短距离在其逆图上跑一边最短路求出原集合中的每一个点到该点的最短距离~那么此点到原集合中每一个点之间的最短距离都是正确的但是对于原集合中的每一个点对之间的最短距离可能能通过松弛此点从而距离变短所以原集合中的每一个点对之间的距离还应该更新一遍。for(int i1;in;i) for(int j1;jn;j) dis[i][j]min(dis[i][j],dis1[i]dis2[j]); //dis1[u]表示u点到新加入点的最短距离,dis2[v]表示新加入点到v点的最短距离那么正题来了floyed是怎样维护每个点对之间的最短距离从而达到保证了算法的正确性呢我的理解是floyed是一个动态规划的过程通过维护一个逐渐增大的集合对任意点对 (i,j)dp[i][j] 是中间点只允许来自当前集合时的最短距离。随着集合的增长集合包含了原图中所有的点时算法就求出了每个点对之间的最短距离。对于算法过程的解释void floyed() { for(int k1;kn;k) { for(int i1;ik;i) for(int j1;jk;j) dp[i][j]min(dp[i][j],dp[i][k]dp[k][j]); //原集合中的每一个点可以通过此新加入的点松弛一遍 for(int i1;ik;i) for(int jk1;jn;j) dp[i][j]min(dp[i][j],dp[i][k]dp[k][j]); //原集合中的每一个点到集合外每一个点的临时最短距离 for(int ik1;in;i) for(int j1;jk;j) dp[i][j]min(dp[i][j],dp[i][k]dp[k][j]); //集合外的每一个点到原集合中的每一个点的临时最短距离 for(int ik1;in;i) for(int jk1;jn;j) dp[i][j]min(dp[i][j],dp[i][k]dp[k][j]); //按照算法定义集合外的点之间可以通过此点松弛距离 } }维护增长的集合是前k-1个点外层第k次循环的时候是将第k个点加入此集合中。此时dp[i][j]表示路径的中间点只来自原集合ij结点之间的临时最短距离(刚开始的时候集合为空那么表示直接相连)所以对于所有点对之间的临时最短距离都可以对此点松弛一遍从而保证了算法的正确性。第一次循环开始之间集合为空此时初始状态为原图中每个点对之间直接距离第k次循环能保证k1次循环时的正确性根据归纳法所以得证floyed算法的正确性~~~~~

相关新闻

【LeetCode】37.解数独

【LeetCode】37.解数独

欢迎来到李耶的频道【LeetCode面试题】。 解数独 37.解数独 题目 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫…

2026/10/30 3:27:19 阅读更多 →
企业自动化运营-电子合同预览-东方仙盟

企业自动化运营-电子合同预览-东方仙盟

代码<!DOCTYPE html> <html> <head><meta charset"utf-8"/><title>&#xff5c;软件服务协议电子确认单</title><meta name"viewport" content"initial-scale1, widthdevice-width, maximum-scale1, user-sca…

2026/11/2 13:57:00 阅读更多 →
从模拟世界到数字王国:单片机 ADC 完全指南

从模拟世界到数字王国:单片机 ADC 完全指南

一、ADC 的基本作用单片机的核心是数字电路&#xff0c;只能处理“0”和“1”。但现实中的物理量——比如温度、压力、电池电压、声音、光照强度——大多是连续变化的模拟量。传感器通常把这些物理量转换成电压信号&#xff0c;然后 ADC 再把电压转换成数字。举例&#xff1a; …

2026/11/2 7:56:22 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年&#xff0c;我大部分时间都在跟浏览器标签页打交道&#xff0c;直到第一次把桌面应用跑起来&#xff0c;才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词&#xff0c;最开始是在某段时间频繁出现在同事的讨论里&#xff0c;一个用HTML…

2026/11/4 1:35:24 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介&#xff1a;亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档&#xff0c;主要面向智能锁安装人员、终端用户及售后维护者&#xff0c;帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件&#xff0c;大小4.37MB&#xff0c;内容结构清晰&#xff…

2026/11/5 1:08:50 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统&#xff0c;整车要求空载跑到8m/s&#xff0c;电机转速已经拉到额定点&#xff0c;驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令&#xff0c;转速纹丝不动&#xff0c;三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/3 11:35:49 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年&#xff0c;用它写过嵌入式驱动、做过游戏服务端&#xff0c;也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词&#xff0c;我其实挺感慨的——这门语言的难点从来不是语法多&#xff0c;而是知识点之间的耦合太深…

2026/11/4 6:23:50 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介&#xff1a;亚太天能T109滑盖智能锁产品说明书以PDF格式发布&#xff0c;适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开&#xff0c;先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能&#xff0c;再给出完整安装步骤&…

2026/11/5 0:54:28 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历&#xff1a;翻开源码注释、论文摘要或者一份专业报告&#xff0c;每个字都认识&#xff0c;连在一起却像天书。想找人聊聊&#xff0c;身边要么没人懂&#xff0c;要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型&#xff0c;几秒钟之后&a…

2026/11/4 19:19:54 阅读更多 →

日新闻

周新闻

月新闻