Floyd算法:用于多源最短路径的求解,算出来的是所有的节点到其余各节点之间的最短距离。
该算法的思路是:首先初始化距离矩阵,然后从第一个点开始逐渐更新矩阵点值。d[i][j]表示从i点到j点的距离。第k次更新时,判断d[i][k]+d[k][j]与d[i][j]的大小,如果前者小,则更新这个值,否则不变。
给一个例子:
具体的floyd实现算法如下[java] view plain copy
package com.blyang; public class Floyd { int[][] Matrix; char[] Nodes; private final int INF = Integer.MAX_VALUE; public Floyd(char[] Nodes, int[][] Matrix){ this.Nodes = Nodes; this.Matrix = Matrix; } public void floyd(){ int[][] distance = new int[Nodes.length][Nodes.length]; // 初始化距离矩阵 for(int i=0; i<Nodes.length; i++){ for(int j=0; j<Nodes.length; j++){ distance[i][j] = Matrix[i][j]; } } //循环更新矩阵的值 for(int k=0; k<Nodes.length; k++){ for(int i=0; i<Nodes.length; i++){ for(int j=0; j<Nodes.length; j++){ int temp = (distance[i][k] == INF || distance[k][j] == INF) ? INF : distance[i][k] + distance[k][j]; if(distance[i][j] > temp){ distance[i][j] = temp; } } } } // 打印floyd最短路径的结果 System.out.printf("floyd: \n"); for (int i = 0; i < Nodes.length; i++) { for (int j = 0; j < Nodes.length; j++) System.out.printf("%12d ", distance[i][j]); System.out.printf("\n"); } } }
在实现之后,针对上图的点和权值,给定一个测试:
package com.blyang; public class Main { public static void main(String[] args) { int INF = Integer.MAX_VALUE; char[] Nodes = {'0', '1', '2', '3'}; int matrix[][] = { /*A*//*B*//*C*//*D*/ /*A*/ { 0, 1, 2, 1}, /*B*/ { INF, 0, INF, INF}, /*C*/ { INF, 3, 0, 1}, /*D*/ { INF, 1, 1, 0}, }; int[] dist = new int[Nodes.length]; Floyd floyd = new Floyd(Nodes, matrix); floyd.floyd(); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
一、弗洛伊德算法介绍 和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。 基本思想 通过Floyd计算图G=(V,E)中各个顶点的最短路径时,需要引入一个矩阵S,矩阵S中的元素a[i][j]表示顶点i(第i个顶点)到顶点j(第j个顶点)的距离。
本文向大家介绍Javascript中的Floyd-Warshall算法,包括了Javascript中的Floyd-Warshall算法的使用技巧和注意事项,需要的朋友参考一下 Djikstra的算法用于查找从一个节点到所有其他节点的最短路径的距离/路径。在某些情况下,我们需要找到从所有节点到所有其他节点的最短路径。这是所有对最短路径算法派上用场的地方。最常用的所有对最短路径算法是Floyd War
旅游规划 作者 陈越 单位 浙江大学 有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。 输入格式: 输入说明:输入数据的第1行给出4个正整数N、M、S、D,其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0~(N−1);M是
本文向大家介绍Java实现SHA-1算法实例,包括了Java实现SHA-1算法实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java实现SHA-1算法的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的java程序设计有所帮助。
我正在寻找一种通用模式来分解一些常见的代码:我需要在具有不同算术属性的类之间实现代数加法和减法。一个典型的例子是可以用秒、小时和分钟表示的间隔,我用一个具有三个int属性的类实现了它。 例如,如果我想减去0秒、0分钟、1小时的周期,减去0秒、30分钟、0小时的周期,我不想获得0秒、-30分钟、1小时的周期。 我需要编码两个时间间隔之间的加减法,有没有通用的模式来编码这个代数?我应该寻找不同的代表吗
本文向大家介绍Java实现雪花算法(snowflake),包括了Java实现雪花算法(snowflake)的使用技巧和注意事项,需要的朋友参考一下 本文主要介绍了Java实现雪花算法(snowflake),分享给大家,具体如下: 简单描述 最高位是符号位,始终为0,不可用。 41位的时间序列,精确到毫秒级,41位的长度可以使用69年。时间位还有一个很重要的作用是可以根据时间进行排序。注意,41位时
本文向大家介绍Java计算器核心算法代码实现,包括了Java计算器核心算法代码实现的使用技巧和注意事项,需要的朋友参考一下 在进行一个表达式的计算时,先将表达式分割成数字和字符串然后利用出入栈将分割后的表达式进行中缀转后缀,再将后缀表达式进行计算得到结果(思想在上一篇写过)现在贴下Java语言的代码实现。(学习Java时间不长所以可能会有很多不足的地方,我会改进也欢迎大神可以给我一些意见和建议~谢
本文向大家介绍java实现折半排序算法,包括了java实现折半排序算法的使用技巧和注意事项,需要的朋友参考一下 折半插入排序(binary insertion sort)是对插入排序算法的一种改进,由于排序算法过程中,就是不断的依次将元素插入前面已排好序的序列中。由于前半部分为已排好序的数列,这样我们不用按顺序依次寻找插入点,可以采用折半查找的方法来加快寻找插入点的速度。 折半排序算法示意图: 以