一、Floyd算法简介

  Floyd算法是求解每对顶点之间的最短路径,时间复杂度为O(∣V∣3)O(|V|^3)O(∣V∣3)。

二、Floyd算法思想

  Floyd算法的基本思想是:

  递推产生一个n阶方阵序列A−1,A0,...,Ak,...,An−1A^{-1},A^{0},...,A^{k},...,A^{n-1}A−1,A0,...,Ak,...,An−1,其中Ak[i][j]A^{k}[i][j]Ak[i][j]表示从顶点viv_{i}vi​到顶点vjv_{j}vj​的路径长度,k表示绕行第k个顶点的运算步骤。
  初始时,对于任意两个顶点viv_{i}vi​和vjv_{j}vj​,若它们之间存在边,则以此边上的权值作为它们之间的最短路径长度;若它们之间不存在有向边,则以∞∞∞作为它们之间的最短路径长度。
  以后逐步尝试在原路径中加入顶点k(k=0,1.…,n-1)作为中间顶点。若增加中间顶点后,得到的路径比原来的路径长度减少了,则以此新路径代替原路径。

算法描述如下:
  定义一个n阶方阵序列A−1,A0,...,Ak,...,An−1A^{-1},A^{0},...,A^{k},...,A^{n-1}A−1,A0,...,Ak,...,An−1,其中,
                A−1[i][j]=arcs[i][j]A^{-1}[i][j]=arcs[i][j]A−1[i][j]=arcs[i][j]
      Ak[i][j]=Min{Ak−1[i][j],Ak−1[i][k]+Ak−1[k][j],k=0,1,...,n−1}A^{k}[i][j]=Min\begin{Bmatrix}{A^{k-1}[i][j],A^{k-1}[i][k]+A^{k-1}[k][j]},k=0,1,...,n-1\end{Bmatrix}Ak[i][j]=Min{Ak−1[i][j],Ak−1[i][k]+Ak−1[k][j],k=0,1,...,n−1​}
式中,A0[i][j]A^{0}[i][j]A0[i][j]是从顶点viv_{i}vi​到顶点vjv_{j}vj​、中间顶点是v0v_{0}v0​的最短路径的长度,Ak[i][j]A^{k}[i][j]Ak[i][j]是从顶点viv_{i}vi​到顶点vjv_{j}vj​、中间顶点的序号不大于k的最短路径的长度。Floyd算法是一个迭代的过程,每迭代一次,在从viv_{i}vi​到顶点vjv_{j}vj​的最短路径上就多考虑了一个顶点;经过n次迭代后,所得到的An−1[i][j]A^{n-1}[i][j]An−1[i][j]就是viv_{i}vi​到vjv_{j}vj​的最短路径长度,即方阵An−1A^{n-1}An−1中就保存了任意一对顶点之间的最短路径长度。

三、Floyd算法代码实现

package com.haiyang.algorithm.floyd;import com.sun.corba.se.impl.orbutil.graph.Graph;import java.util.Arrays;/*** @author haiYang* @create 2022-02-09 10:44*/
public class FloydAlgorithm {public static void main(String[] args) {// 测试看看图是否创建成功char[] vertex = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};//创建邻接矩阵int[][] matrix = new int[vertex.length][vertex.length];final int N = 65535;matrix[0] = new int[]{0, 5, 7, N, N, N, 2};matrix[1] = new int[]{5, 0, N, 9, N, N, 3};matrix[2] = new int[]{7, N, 0, N, 8, N, N};matrix[3] = new int[]{N, 9, N, 0, N, 4, N};matrix[4] = new int[]{N, N, 8, N, 0, 5, 4};matrix[5] = new int[]{N, N, N, 4, 5, 0, 6};matrix[6] = new int[]{2, 3, N, N, 4, 6, 0};//创建 Graph 对象FGraph graph = new FGraph(vertex.length, matrix, vertex);//调用弗洛伊德算法graph.floyd();graph.show();graph.showAToB('C', 'D', vertex);}
}class FGraph {//顶点集合private char[] vertex;//邻接矩阵private int[][] arcs;//前驱矩阵private int[][] path;public FGraph(int vertexNum, int[][] arcs, char[] vertex) {this.vertex = vertex;this.arcs = arcs;this.path = new int[vertexNum][vertexNum];for (int i = 0; i < vertexNum; i++) {Arrays.fill(path[i], i);}}public void show() {System.out.println("==========邻接矩阵==========");for (int i = 0; i < arcs.length; i++) {for (int j = 0; j < arcs.length; j++) {System.out.print(arcs[i][j] + " ");}System.out.println();}System.out.println("==========前驱矩阵==========");for (int i = 0; i < path.length; i++) {for (int j = 0; j < path.length; j++) {System.out.print(vertex[path[i][j]] + " ");}System.out.println();}}public void floyd() {//保存距离int len = 0;//k为中间顶点for (int k = 0; k < arcs.length; k++) {//i为开始顶点for (int i = 0; i < arcs.length; i++) {//j为结束顶点for (int j = 0; j < arcs.length; j++) {len = arcs[i][k] + arcs[k][j];if (len < arcs[i][j]) {arcs[i][j] = len;//更新距离path[i][j] = path[k][j];//更新前驱矩阵}}}}}public void showAToB(char a, char b, char[] vertex) {int beginIndex = 0;int endIndex = 0;for (int i = 0; i < vertex.length; i++) {if (a == vertex[i]) {beginIndex = i;}if (b == vertex[i]) {endIndex = i;}}System.out.println(a + "到" + b + "的距离为:" + arcs[beginIndex][endIndex]);System.out.print("路径为:");showAToBPath(beginIndex, endIndex, vertex);System.out.print(b);}public void showAToBPath(int beginIndex, int endIndex, char[] vertex) {if (path[beginIndex][endIndex] == endIndex && path[beginIndex][endIndex] == beginIndex) {return;}showAToBPath(beginIndex, path[beginIndex][endIndex], vertex);System.out.print(vertex[path[beginIndex][endIndex]] + " ");}}

Floyd算法(java)相关推荐

  1. Floyd算法 Java实现

    Floyd算法 Java实现 算法导入 算法核心 代码实现 参考资料 结尾 算法导入 在上一篇博客中,咱讲述了求单源最短路径的一种经典算法 Dijkstra 算法,想了解的同学可以走前门瞅一瞅,记得回 ...

  2. POJ3615(Cow Hurdles)图论-Floyd算法JAVA高速IO外挂!

    POJ3615(Cow Hurdles) 图论-Floyd算法JAVA高速IO外挂! package classical_algorithm.graph.FloydWarshall; //http:/ ...

  3. java floyd_百度百科里面的floyd算法java的代码,总是无法运行。请问是代码有问题吗,如何编译啊?...

    展开全部 不能编译运行的说法是错误,但是结果是否正确,我就32313133353236313431303231363533e59b9ee7ad9431333335303539不知道了,我不懂这个算法p ...

  4. floyed java_Floyd算法java实现demo

    Floyd算法java实现,如下: package a; /** * ┏┓ ┏┓+ + * ┏┛┻━━━┛┻┓ + + * ┃ ┃ * ┃ ━ ┃ ++ + + + * ████━████ ┃+ * ...

  5. 【最短路径Floyd算法详解推导过程】看完这篇,你还能不懂Floyd算法?还不会?...

    简介 Floyd-Warshall算法(Floyd-Warshall algorithm),是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似.该算法名称以 ...

  6. 图论最短路径算法 Java实现

    Dijkstra和Floyd算法 Java实现 Dijkstra算法 Dijkstra算法改进 优先队列实现 Floyd算法 Dijkstra算法 问题描述: 单源最短路径问题 public clas ...

  7. 牛客网 最短路 Floyd算法 Dijkstra算法 Java大数

    链接:https://www.nowcoder.com/questionTerminal/a29d0b5eb46b4b90bfa22aa98cf5ff17 来源:牛客网 最短路径 热度指数:2992 ...

  8. 【Java数据结构与算法】第二十章 Dijkstra算法和Floyd算法

    第二十章 Dijkstra算法和Floyd算法 文章目录 第二十章 Dijkstra算法和Floyd算法 一.Dijkstra算法 1.介绍 2.代码实现 二.Floyd算法 1.介绍 2.代码实现 ...

  9. floyd算法java_利用JAVA和Floyd算法实现上海地铁最短路线搜索系统

    [实例简介] Floyd算法基于JAVA实现上海地铁最短路线搜索系统,图形界面,支持新建删除站点以及新建线路. [实例截图] [核心代码] SUBWAY └── SUBWAY ├── bin │   ...

最新文章

  1. textField textView输入限制
  2. Windows7 Search Federation功能解读
  3. idea java 代码混淆加密_使用 IntelliJ IDEA 开发一般 Java 应用程序时配置 Allatori 进行代码混淆...
  4. openglshader实现虚拟场景_云桌面,实现办公终端的统一管理与运维
  5. python的ctypes模块详解数组_如何使用Python的ctypes和readinto读取包含数组的结构?...
  6. 求指教,PSO算法跟踪光伏电池最大功率点
  7. 64位win10下usb转485驱动
  8. 空间计量经济学(2)---广义空间自回归与空间误差模型
  9. 计算机制造商提供的驱动程序,英特尔通用显卡驱动程序将覆盖计算机制造商(OEM)自定义...
  10. 应广PFS122单片机比较器测供电电源VDD电压带临界点消抖处理
  11. 买北京息壤空间 大家注意了别上当
  12. Python函数和面向对象程序设计(课本总结)
  13. 最佳运动类APP-Keep原型设计与欣赏
  14. 奉劝想把编程学好的学弟们 · 如何高效学习编程?
  15. App马甲包开发需要注意的地方
  16. vue父子组件之间的传值,及互相调用父子组件之间的方法
  17. 睢宁县微服务平台_微服务
  18. 帝国cms推送插件-帝国cms管理系统-帝国cms免费模板插件
  19. 在Android平台启动Linux C/C++应用程序
  20. 水工建筑物类毕业论文文献包含哪些?

热门文章

  1. Win 10家庭版如何添加多用户
  2. 强叔侃墙_NAT_nopat示例
  3. vscode连服务器python拓展出现问题
  4. C语言多线程运行时间计算
  5. Java字符串分割的三种方法
  6. Jetson Nano设置风扇自启动
  7. Tomcat三种部署方式
  8. Vue UI组件库以及 Element UI 使用
  9. 安装mysql8.0 https://dl.bintray.com/ 网址被禁用问题
  10. 树莓派python3.7.3安装opencv、TensorFlow2.3