弗洛伊德算法介绍

和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。

基本思想

通过Floyd计算图G=(V,E)中各个顶点的最短路径时,需要引入一个矩阵S,矩阵S中的元素a[i][j]表示顶点i(第i个顶点)到顶点j(第j个顶点)的距离。

假设图G中顶点个数为N,则需要对矩阵S进行N次更新。初始时,矩阵S中顶点a[i][j]的距离为顶点i到顶点j的权值;如果i和j不相邻,则a[i][j]=∞。 接下来开始,对矩阵S进行N次更新。第1次更新时,如果"a[i][j]的距离" > "a[i][0]+a[0][j]"(a[i][0]+a[0][j]表示"i与j之间经过第1个顶点的距离"),则更新a[i][j]为"a[i][0]+a[0][j]"。 同理,第k次更新时,如果"a[i][j]的距离" > "a[i][k]+a[k][j]",则更新a[i][j]为"a[i][k]+a[k][j]"。更新N次之后,操作完成!

单纯的看上面的理论可能比较难以理解,下面通过实例来对该算法进行说明。

弗洛伊德算法图解

以上图G4为例,来对弗洛伊德进行算法演示。

初始状态:S是记录各个顶点间最短路径的矩阵。 
第1步:初始化S。 
    矩阵S中顶点a[i][j]的距离为顶点i到顶点j的权值;如果i和j不相邻,则a[i][j]=∞。实际上,就是将图的原始矩阵复制到S中。 
    注:a[i][j]表示矩阵S中顶点i(第i个顶点)到顶点j(第j个顶点)的距离。

第2步:以顶点A(第1个顶点)为中介点,若a[i][j] > a[i][0]+a[0][j],则设置a[i][j]=a[i][0]+a[0][j]。 
    以顶点a[1]6,上一步操作之后,a[1][6]=∞;而将A作为中介点时,(B,A)=12,(A,G)=14,因此B和G之间的距离可以更新为26。

同理,依次将顶点B,C,D,E,F,G作为中介点,并更新a[i][j]的大小。

弗洛伊德算法的代码说明

以"邻接矩阵"为例对弗洛伊德算法进行说明,对于"邻接表"实现的图在后面会给出相应的源码。

1. 基本定义

public class MatrixUDG {private int mEdgNum;        // 边的数量private char[] mVexs;       // 顶点集合private int[][] mMatrix;    // 邻接矩阵private static final int INF = Integer.MAX_VALUE;   // 最大值...
}

MatrixUDG是邻接矩阵对应的结构体。mVexs用于保存顶点,mEdgNum用于保存边数,mMatrix则是用于保存矩阵信息的二维数组。例如,mMatrix[i][j]=1,则表示"顶点i(即mVexs[i])"和"顶点j(即mVexs[j])"是邻接点;mMatrix[i][j]=0,则表示它们不是邻接点。

package graph;import java.util.Arrays;public class Prim {public static void main(String[] args) {  int max = Integer.MAX_VALUE-10000;  int graph[][] = {  {max,max,10,max,30,100},  {max,max,5,max,max,max},  {max,max,max,50,max,max},  {max,max,max,max,max,10},  {max,max,max,20,max,60},  {max,max,max,max,max,max},  };  弗洛伊德(graph); }  public static void 弗洛伊德(int[][] graph){//p[0][1] = 3表示节点0到节点1的最短路径经过了3,即0->3->1int[][] path = new int[6][6];//初始化path,初始状态path[i][j] =j,表示i直接到j不经过其他点//此时graph保存的也是i直接到j的路径长度,MAX表示此路不通for(int i=0;i<6;i++){for(int j=0;j<6;j++){path[i][j] = j;}}for(int i=0;i<6;i++){//start为路径起点for(int start=0;start<6;start++){//end为路径终点for(int end=0;end<6;end++){//防止MAX+一个数 导致溢出if(graph[start][i]==Integer.MAX_VALUE-10000||graph[i][end]==Integer.MAX_VALUE-10000){continue;}//如果以i的路过点的路径比当前所存储的最短路径短的话//则更新此路径为最短路径,并在path中标注出当前最短路径是经过i达到的if(graph[start][end] > graph[start][i]+graph[i][end]){graph[start][end] = graph[start][i]+graph[i][end];path[start][end] = i;}}}}System.out.println();}}

最短路径-弗洛伊德算法的java实现相关推荐

  1. 弗洛伊德算法学习(Java)

    弗洛伊德算法学习(Java) 学习视频:尚硅谷韩老师java讲解数据结构和算法 一. 弗洛伊德(Floyd)算法介绍 和 Dijkstra 算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加 ...

  2. [最短路径弗洛伊德算法]三层循环顺序问题

    [最短路径弗洛伊德算法](三层循环顺序问题) 先上代码 for(int i=0;i<city;i++)for(int j=0;j<city;j++)for(int k=0;k<cit ...

  3. 图解最短路径之弗洛伊德算法(Java实现)

    概述 Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似.该算法是一种在具有正或负边缘权重(但没有负环)的加权图中找到最短路径的 ...

  4. 弗洛伊德算法(Java)

    目录 第8章弗洛伊德算法 8.1算法介绍 8.2 算法图解 8.3 应用场景 8.4 代码实现 本次弗洛伊德算法算法 的教程出自韩顺平的数据结构与算法 第8章弗洛伊德算法 8.1算法介绍 弗洛伊德(F ...

  5. 求最短路径 —— 弗洛伊德算法

    弗洛伊德算法是求图中任意一对顶点间的最短路径的算法. 算法思想 递推产生一个n解方阵序列,,. . . ,,. . . , 其中[ i ][ j ]表示从顶点到顶点的路径长度,k表示绕行第k个顶点的运 ...

  6. (王道408考研数据结构)第六章图-第四节5:最短路径之弗洛伊德算法(思想、代码、演示、答题规范)

    文章目录 一:动态规划基本思想 二:弗洛伊德(Floyd)算法基本思想 三:弗洛伊德(Floyd)算法代码实现 四:弗洛伊德(Floyd)算法代码视频演示 五:弗洛伊德(Floyd)算法代码答题规范 ...

  7. 【算法】弗洛伊德算法 最短路径算法

    文章目录 1.概述 2.图解 2.1 图示 2.2 弗洛伊德算法的步骤: 3.代码 1.概述 弗洛伊德(Floyd)算法介绍 和Dijkstra算法一 样,弗洛伊德(Floyd)算法也是一种用 于寻找 ...

  8. 最短路径之弗洛伊德算法

    [1]为什么需要弗洛伊德算法? 带权图中单个源点到所有顶点的最短路径问题可以用<迪杰斯特拉算法>求解. 那如果要求图中每一个顶点与其它顶点之间的最短路径呢?类似可以想到的方法为: 每次以一 ...

  9. Java 图的最短路径问题-迪杰斯特拉算法VS弗洛伊德算法

    1.迪杰斯特拉算法VS弗洛伊德算法 迪杰斯特拉算法通过选定的被访问顶点,求出从出发访问顶点到其他顶点的最短路径: 弗洛伊德算法中每一个顶点都是出发访问点,所以需要将每一个顶点看做被访问顶点,求出从每一 ...

最新文章

  1. python浪漫表白代码
  2. 多线程:为什么不能override start方法
  3. c#冒泡、快速、选择和插入排序算法的项目应用
  4. fritz_如何使用Fritz.ai将机器学习应用于Android
  5. 【图像分割】图像分割专栏栏主自述:分割,我们究竟在研究什么?
  6. android root 挂载分区,adb — adb disable-verity, adb remount 实现重新挂载system分区为可读写分区...
  7. Document Builder: 怎样根据document ID使用API获得document的所有数据
  8. 最新突破!科学家研发出世界首款精神控制手臂机器人;近日Kubernetes 1.15 正式发布;雷军公布小米手机产品线布局……...
  9. [JSOI2016]病毒感染[dp]
  10. Asp.Net水晶报表边框不显示之解决方法
  11. 推荐几个Python+OpenCV实战项目
  12. 取代ClubHouse的节奏!这款开源聊天室太好用了
  13. Android 将自己的应用改为系统应用
  14. p6spy监测mysql_JDBC数据库访问操作的动态监测 之 p6spy
  15. 数据库 之带子查询的操作--插入子查询结果、带子查询的修改语句、带子查询的删除语句
  16. 把Excel批注的“红三角”放在单元格左上角_44个Excel使用技巧:怪不得同事表格类工作那么快完成,学以致用...
  17. 学习C++该看什么书?
  18. ug计算机环境变量,教你如何添加和删除环境变量(UG软件必用)
  19. 分布式搜索引擎的研究
  20. 诺基亚安卓手机_诺基亚“诈尸”更新塞班系统,难道想要逆袭?

热门文章

  1. 分享:你必须知道的H5加速器九大常识!
  2. iPhone突然掉电快是什么情况,该如何解决?
  3. 阿卡迪亚大学的计算机科学,阿卡迪亚大学计算机科学移动与普通计算本科申请.pdf...
  4. DolphinScheduler征稿 —手把手教你如何使用小豚调度
  5. dell12v18a怎么改_几招教你改DELL 12V/18A适配器电压和保护方法
  6. 人物志 | 美团无人机毛一年:建成空中机器人物流网络是技术人一生的梦想
  7. 直接添加GO词云到基因表达热图上
  8. Solidwork仿真总结(Motion,Xpress、Simulation,Flow Simulaiton)
  9. 开源数值计算软件OCTAVE 、SCILAB、R、Matlab简介
  10. 我眼中的未来计算机作文1000字,我的未来作文1000字