最短路径——Floyd算法
最短路径——Floyd算法
可以用来求带权图和无权图
Floyd算法:求出每一对顶点之间的最短路径
使用动态规划思想,将问题的求解分为多个阶段
第一个矩阵就是图的邻接矩阵
第二个矩阵表示两个顶点之间的中转点
遍历上一个阶段留下来的矩阵A,对于上一个矩阵A当中的每一个具体的元素我们都进行:
若 A^(k-1)[i] [j]>A^(k-1)[i] [k]+A^(k-1)[k] [j]
则 A^(k)[i] [j] = A^(k-1)[i] [k] + A^(k-1)[k] [j];
path^(k)[i] [j] = k
否则A^(k) 和 path^(k)保持原值
Floyd算法核心代码
//。。。。准备工作,初始化矩阵A和path for(int k=0;k<n;k++){ //考虑以vk作为中转点 for(int i=0;i<n;i++){ //遍历整个矩阵,i为行号,j为列号 for(int j=0;j<n;j++){ if(A[i][j]>A[i][k]+A[k][j]){ //以vk作为中转点的路径更短 A[i][j] = A[i][k]+A[k][j]; //更新最短路径长度 path[i][j] = k; //中转点 } } } }
Floyd算法实例
练习:floyd算法用于负权图
//。。。。准备工作,初始化矩阵A和path for(int k=0;k<n;k++){ //考虑以vk作为中转点 for(int i=0;i<n;i++){ //遍历整个矩阵,i为行号,j为列号 for(int j=0;j<n;j++){ if(A[i][j]>A[i][k]+A[k][j]){ //以vk作为中转点的路径更短 A[i][j] = A[i][k]+A[k][j]; //更新最短路径长度 path[i][j] = k; //中转点 } } } }
不能解决的问题
带有“负权值回路”的图
这种图可能没有最短路径
知识回顾
本文作者:Jev_0987
本文链接:https://www.cnblogs.com/jev-0987/p/13213497.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步