【Java数据结构与算法】弗洛伊德算法
弗洛伊德(Floyd)算法基本介绍
应用场景
- 胜利乡有7个村庄(A,B,C,D,E,F,G)。
- 各个村庄的距离用边线表示(权),比如A-B距离5公里。
- 问:如何计算出各村庄到其它各村庄的最短距离?
基本介绍
- 和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法。该算法名称以创始人之一、1978 年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特●弗洛伊德命名。
- 弗洛伊德算法(Floyd)计算图中各个顶点之间的最短路径。
- 迪杰斯特拉算法用于计算图中某-一个顶点到其他顶点的最短路径。
- 弗洛伊德算法VS迪杰斯特拉算法:迪杰斯特拉算法通过选定的被访问顶点,求出从出发访问顶点到其他顶点的最短路径;弗洛伊德算法中每一个顶点都是出发访问点,所以需要将每一个顶点看做被访问顶点,求出从每一个顶点到其他顶点的最短路径。
思路分析
-
设置顶点vi到顶点vk的最短路径已知为Lik,顶点vk到vj的最短路径已知为Lkj,顶点vi到vj的路径为Lij, 则vi到vj的最短路径为: min((Lik+Lkj),Lij), vk 的取值为图中所有顶点,则可获得vi到vj的最短路径。
-
至于vi到vk的最短路径Lik或者vk到vj的最短路径Lkj,是以同样的方式获得。
-
弗洛伊德(Floyd)算法图解分析。
Floyd算法解决最短路径问题步骤图解
弗洛伊德算法的步骤:
第一轮循环中,以A(下标为: 0)作 为中间顶点[即把A作为中间顶点的所有情况都进行遍历,就会得到更新距离表和前驱关系],距离表和前驱关系更新为:
- 以A顶点作为中间顶点是,C->A->G的距离由N->9, 同理G到C; C->A->B的距离由N->12, 同理B到C。
- 更换中间顶点,循环执行操作,直到所有顶点都作为中间顶点更新后,计算结束。
Floyd算法解决最短路径问题-构建图
代码
1 | package com.algorithm.floyd; |
运行结果
1 | A A A A A A A |
Floyd算法解决最短路径问题-完整代码
代码
1 | package com.algorithm.floyd; |
运行结果
1 | A A A F G G A |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hey,Joker!
评论
ValineTwikoo