算法其实很简单—弗洛伊德(Floyd)算法
目录
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做为中间顶点的情况有:
- C->A->G:9,C->G:N
- C->A->B:12,C->B:N
- 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. 克鲁斯卡尔算法介绍 2. 公交站问题 2.1 克鲁斯卡尔算法图解 2.2 克鲁斯卡尔算法分析 2.3 如何判断是否构成回路 3. 代码实现 1. 克鲁斯卡尔算法介绍 1)克鲁斯卡尔(Kru ...
- Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法
1.Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法 1.1 迪杰斯特拉(Dijkstra)算法 1.1.1 迪杰斯特拉(Dijkstra)算法介绍 迪杰斯特拉(Dijkstra ...
- 弗洛伊德(Floyd)算法求解图的最短路径
弗洛伊德(Froyd)算法用于求解所有顶点到所有顶点的的最短路径.时间复杂度为O(n^3). 正如我们所知道的,Floyd算法用于求最短路径.Floyd算法可以说是Warshall算法的扩展,三个fo ...
- 数据结构与算法(7-4)最短路径(迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法)
目录 一.最短路径概念 二.迪杰斯特拉(Dijkstra)算法(单源最短路径) 1.原理 2.过程 3.代码 三.弗洛伊德(Floyd)算法(多源最短路径) 1.原理 2.存储 3.遍历 4.代码 参 ...
- 060.弗洛伊德(Floyd)算法的原理以及解决最短路径问题
1. 弗洛伊德(Floyd)算法的原理 1.1. 基本介绍 1.1.1. 弗洛伊德算法和迪杰斯特拉算法比较 1.2. 算法步骤 1.3. 步骤图解 1.3.1. 第一轮循环 1.3.2. 找出每个点作 ...
- Java实现之弗洛伊德(Floyd)算法
一.问题引入 1.问题引入 1)胜利乡有7个村庄(A,B,C,D,E,F, G) 2)各个村庄的距离用边线表示(权),比如A-B距离5公里3)问:如何计算出各村庄到其它各村庄的最短距离? 二.基本介绍 ...
- 弗洛伊德(Floyd)算法
1.介绍 Floyd-Warshall算法(英语:Floyd-Warshall algorithm),中文亦称弗洛伊德算法或佛洛依德算法,是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权 ...
- 【数据结构笔记24】单源最短路(迪克斯拉Dijkstra算法),多源最短路(弗洛伊德Floyd算法)
本次笔记内容: 7.1.1 概述 7.1.2 无权图的单源最短路 7.1.3 有权图的单源最短路 7.1.3-s 有权图的单源最短路示例 7.1.4 多源最短路算法 文章目录 最短路径问题 最短路径问 ...
- 一道很简单的贪心算法题~【贪心:我不要脸的伐?】
文章目录 题目描述 输入 输出 样例输入 样例输出 C语言代码实现 思路 排序 处理 完整代码 C++代码实现 排序 完整代码 彩蛋 题目描述 小健有一家自己的商店,主营牛奶饮品,最近资金紧张,他想以 ...
最新文章
- 第五章 PX4-GPS解析
- du 查看使用 linux命令,如何正确使用Linux命令–du
- Linux/Unix 新手和专家教程
- 东莞市商业学校计算机平面设计在哪个校区,东莞市商业学校
- Mysql 扩展性设计之数据切分、那么数据切分后会带来哪些问题呢?比如分布式事务、数据的一致性、垂直切分和水平切分应用场景
- Android 蓝牙遥控器的连接
- 27款经典网站设计必备的CSS框架
- 起搏器可以用计算机吗,带心脏起搏器能否使用电脑
- latex 设置pdf的页边距
- Spring、SpringMVC、SpringBoot、SpringCloud的联系与区别(看了多篇后的自我总结)
- GNS3 添加思科交换机
- journalctl命令详解
- 达摩院提出时序预测新模型 有效提升预测精准度
- React实现递归组件
- java 字符串转pdf_Java pdf转String 并修正格式
- 微信隐藏功能系列:微信亲属卡怎么用?只需要3步
- 下载并安装 Node
- 【Linux】Protected multilib versions XXX错误
- 周杰伦:他们只顾嘲讽,却不知眼前是神的降生
- 优粮生活炒菜机器人_餐厅孵化器“优粮生活”,用孵化模式打造统一独立外卖品牌...