目录

1.弗洛伊德(Floyd)算法介绍

2.弗洛伊德(Floyd)算法最佳应用-最短路径

3.弗洛伊德(Floyd)算法图解分析

3.1 弗洛伊德算法的步骤:

4.代码实现


1.弗洛伊德(Floyd)算法介绍

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

2)弗洛伊德算法(Floyd)计算图中各个顶点之间的最短路径

3)迪杰斯特拉算法用于计算图中某一个顶点到其他顶点的最短路径。

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

2.弗洛伊德(Floyd)算法最佳应用-最短路径

1)胜利乡有7个村庄(A,B,C,D,E,E, G)

2)各个村庄的距离用边线表示(权),比如A-B距离5公里

3)问:如何计算出各村庄到其它各村庄的最短距离?

3.弗洛伊德(Floyd)算法图解分析

1)设置顶点vi到顶点vk的最短路径己知为Lik,顶点vk到vj的最短路径已知为Lkj,顶点vi到vj的路径为Lij,则vi到vj的最 短路径为: min((Lik+Lkj),Lij), vk的取值为图中所有顶点,则可获得vi到vj的最短路径

2)至于vi到vk的最短路径Lik或者vk到vj的最短路径Lkj,是以同样的方式获得

3)弗洛伊德(Floyd)算法图解分析举例说明

3.1 弗洛伊德算法的步骤:

初始状态:

第一轮循环中,以A(下标为: 0)作为中间顶点[即把A作为中间顶点的所有情况都进行遍历,

就会得到更新距离表和前驱关系],距离表和前驱关系更新为:

将A做为中间顶点的情况有:

  1. C->A->G:9,C->G:N
  2. C->A->B:12,C->B:N
  3. G->A->B:7,G->B:3

通过比较,得出最小的值,然后更新距离表和前驱关系表

以此类推。。。

4.代码实现

package com.example.datastructureandalgorithm.floyd;import java.util.Arrays;/*** @author 浪子傑* @version 1.0* @date 2020/6/27*/
public class FloydDemo {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 graph = new Graph(vertex, matrix);graph.floyd();graph.show();}
}// 创建图
class Graph {/*** 存放顶点的数组*/private char[] vertex;/*** 保存各个顶点到其他顶点的距离*/private int[][] dis;/*** 保存到达目标顶点的前驱节点*/private int[][] pre;/*** 构造函数** @param vertex 顶点数组* @param dis    邻接矩阵*/public Graph(char[] vertex, int[][] dis) {int length = vertex.length;this.vertex = vertex;this.dis = dis;this.pre = new int[length][length];for (int i = 0; i < length; i++) {Arrays.fill(pre[i], i);}}/*** 展示*/public void show() {for (int i = 0; i < dis.length; i++) {for (int j = 0; j < dis[i].length; j++) {System.out.print(vertex[pre[i][j]] + " ");}System.out.println();for (int j = 0; j < dis[i].length; j++) {System.out.print("(" + vertex[i] + "-->" + vertex[j] + ":" + dis[i][j] + ")");}System.out.println();System.out.println();}}/*** 弗洛伊德算法*/public void floyd() {// k为中间节点的下标for (int k = 0; k < dis.length; k++) {// i为开始节点的下标for (int i = 0; i < dis.length; i++) {// j为结束节点的下标for (int j = 0; j < dis.length; j++) {// 计算以k为中间节点,i为开始节点,j为结束节点,i->k->j的距离int length = dis[i][k] + dis[k][j];// 将i->k->j的距离与i->j的距离进行比较// 如果i->j的距离大,则更新距离表和前驱节点表if (length < dis[i][j]) {dis[i][j] = length;pre[i][j] = pre[i][k];}}}}}
}

算法其实很简单—弗洛伊德(Floyd)算法相关推荐

  1. 算法其实很简单—克鲁斯卡尔算法

    目录 1. 克鲁斯卡尔算法介绍 2. 公交站问题 2.1 克鲁斯卡尔算法图解 2.2 克鲁斯卡尔算法分析 2.3 如何判断是否构成回路 3. 代码实现 1. 克鲁斯卡尔算法介绍 1)克鲁斯卡尔(Kru ...

  2. Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法

    1.Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法 1.1 迪杰斯特拉(Dijkstra)算法 1.1.1 迪杰斯特拉(Dijkstra)算法介绍 迪杰斯特拉(Dijkstra ...

  3. 弗洛伊德(Floyd)算法求解图的最短路径

    弗洛伊德(Froyd)算法用于求解所有顶点到所有顶点的的最短路径.时间复杂度为O(n^3). 正如我们所知道的,Floyd算法用于求最短路径.Floyd算法可以说是Warshall算法的扩展,三个fo ...

  4. 数据结构与算法(7-4)最短路径(迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法)

    目录 一.最短路径概念 二.迪杰斯特拉(Dijkstra)算法(单源最短路径) 1.原理 2.过程 3.代码 三.弗洛伊德(Floyd)算法(多源最短路径) 1.原理 2.存储 3.遍历 4.代码 参 ...

  5. 060.弗洛伊德(Floyd)算法的原理以及解决最短路径问题

    1. 弗洛伊德(Floyd)算法的原理 1.1. 基本介绍 1.1.1. 弗洛伊德算法和迪杰斯特拉算法比较 1.2. 算法步骤 1.3. 步骤图解 1.3.1. 第一轮循环 1.3.2. 找出每个点作 ...

  6. Java实现之弗洛伊德(Floyd)算法

    一.问题引入 1.问题引入 1)胜利乡有7个村庄(A,B,C,D,E,F, G) 2)各个村庄的距离用边线表示(权),比如A-B距离5公里3)问:如何计算出各村庄到其它各村庄的最短距离? 二.基本介绍 ...

  7. 弗洛伊德(Floyd)算法

    1.介绍 Floyd-Warshall算法(英语:Floyd-Warshall algorithm),中文亦称弗洛伊德算法或佛洛依德算法,是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权 ...

  8. 【数据结构笔记24】单源最短路(迪克斯拉Dijkstra算法),多源最短路(弗洛伊德Floyd算法)

    本次笔记内容: 7.1.1 概述 7.1.2 无权图的单源最短路 7.1.3 有权图的单源最短路 7.1.3-s 有权图的单源最短路示例 7.1.4 多源最短路算法 文章目录 最短路径问题 最短路径问 ...

  9. 一道很简单的贪心算法题~【贪心:我不要脸的伐?】

    文章目录 题目描述 输入 输出 样例输入 样例输出 C语言代码实现 思路 排序 处理 完整代码 C++代码实现 排序 完整代码 彩蛋 题目描述 小健有一家自己的商店,主营牛奶饮品,最近资金紧张,他想以 ...

最新文章

  1. 第五章 PX4-GPS解析
  2. du 查看使用 linux命令,如何正确使用Linux命令–du
  3. Linux/Unix 新手和专家教程
  4. 东莞市商业学校计算机平面设计在哪个校区,东莞市商业学校
  5. Mysql 扩展性设计之数据切分、那么数据切分后会带来哪些问题呢?比如分布式事务、数据的一致性、垂直切分和水平切分应用场景
  6. Android 蓝牙遥控器的连接
  7. 27款经典网站设计必备的CSS框架
  8. 起搏器可以用计算机吗,带心脏起搏器能否使用电脑
  9. latex 设置pdf的页边距
  10. Spring、SpringMVC、SpringBoot、SpringCloud的联系与区别(看了多篇后的自我总结)
  11. GNS3 添加思科交换机
  12. journalctl命令详解
  13. 达摩院提出时序预测新模型 有效提升预测精准度
  14. React实现递归组件
  15. java 字符串转pdf_Java pdf转String 并修正格式
  16. 微信隐藏功能系列:微信亲属卡怎么用?只需要3步
  17. 下载并安装 Node
  18. 【Linux】Protected multilib versions XXX错误
  19. 周杰伦:他们只顾嘲讽,却不知眼前是神的降生
  20. 优粮生活炒菜机器人_餐厅孵化器“优粮生活”,用孵化模式打造统一独立外卖品牌...

热门文章

  1. 没有网线的时候怎么让虚拟机使用Windows的wifi上网设置
  2. GIS常用符号化色带(超级色带)根据python制作
  3. [转]《纪念胡新宇君》
  4. 计算机组成原理-组成篇(上)
  5. 计算机的学生跨专业考研
  6. 无线蓝牙耳机哪个品牌延迟低?玩游戏延迟低的蓝牙耳机推荐
  7. PostgreSQL SQL 语言:函数和操作符
  8. 使用 Fragment 处理 onActivityResult
  9. STM32F407ZGT6单片机连接ST_LINK和USB转TTL的接线方法+舵机接线方法
  10. 中心信令服务器编码,信令网的信令点编码