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

简介

 Floyd-Warshall算法(Floyd-Warshall algorithm),是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。

简单的说就是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包。Floyd-Warshall算法的时间复杂度为O(N3),空间复杂度为O(N2)。

解决最短路径问题有几个出名的算法:

  • 1.dijkstra算法,最经典的单源最短路径算法

  • 2.bellman-ford算法,允许负权边的单源最短路径算法

  • 3.spfa,其实是bellman-ford+队列优化,其实和bfs的关系更密一点

  • 4.floyd算法,经典的多源最短路径算法

今天先说说Floyd

Floyd算法详解

描述

a)如图:存在【0,1,2,3】 4个点,两点之间的距离就是边上的数字,如果两点之间,没有边相连,则无法到达,为无穷大。 
b)要让任意两点(例如从顶点a点到顶点b)之间的路程变短,只能引入第三个点(顶点k),并通过这个顶点k中转即a->k->b,才可能缩短原来从顶点a点到顶点b的路程。那么这个中转的顶点k是0~n中的哪个点呢?
image.png

算法过程

准备

1)如图 0->1距离为5,0->2不可达,距离为∞,0->3距离为7……依次可将图转化为邻接矩阵(主对角线,也就是自身到自身,我们规定距离为0,不可达为无穷大),如图矩阵 用于存放任意一对顶点之间的最短路径权值。
image.png
2)再创建一个二维数组Path路径数组,用于存放任意一对顶点之间的最短路径。每个单元格的内容表示从i点到j点途经的顶点。(初始还未开始查找,默认-1)
image.png

image.png

开始查找

1)列举所有的路径(自己到自己不算)

image.png

即为:
0 -> 1 , 0 -> 2 , 0 -> 3 ,
1 -> 0 , 1 -> 2 , 1 -> 3 ,
2 -> 0 , 1 -> 1 , 1 -> 3
转化成二元数组即为:
{0,1},{0,2},{0,3},{1,0},{1,2},{1,3},{2,0},{2,1},{2,3},{3,0},{3,1},{3,2}

2)选择编号为0的点为中间点

{0,1},{0,2},{0,3},{1,0},{1,2},{1,3},{2,0},{2,1},{2,3},{3,0},{3,1},{3,2}
从上面中二元组集合的第一个元素开始,循环执行以下过程:

1. 用i,j两个变量分别指向二元组里的两个元素,比如{0,1}这个二元组,i指向0;j指向1
2. 判断 (A[ i ][ 0 ]+A[ 0 ][ j ] ) < A[ i ][ j ] (即判断 i -> j,i点到j点的距离是否小于从0点中转的距离),如果false,则判断下一组二元数组。
3. 如果表达式为真,更新A[ i ] [ j ]的值为A[ i ] [ 0 ] + A[ 0 ] [ j ],Path[ i ] [ j ]的值为点0(即设置i到j要经过0点中转)

{0,1}按照此过程执行之后,
image.png
0->0 + 0->1的距离不小于0->1 ,下一组{0,2},{0,3}, {1,0},{2,0},{3,0}也同理

{1,2}按照此过程执行,A[1,0] 无穷大, A[0,2]也是无穷大,而A[1,4] = 4,则1点到2点肯定不会从0点中转。

A[1][0]无穷大同理下一组{1,2}, {1,3}也同理

{2,1}按照此过程执行,A[2][0] = 3 ,A[0][1]=5 ,A[2][1] = 3那么 A[2][0]+ ,A[0][1] > A[2][1]
…………
依次类推,遍历二元组集合,没有0点适合做中转的

3)选择编号为1的点为中间点

4)选择编号为2的点为中间点

依次类推,遍历二元组集合{0,1},{0,2},{0,3},{1,0},{1,2},{1,3},{2,0},{2,1},{2,3},{3,0},{3,1},{3,2}
,当遍历{3,0}时,A[3][2] = 1 ,A[2][0]=3 ,A[3][0] = 不可达,那么 2点适合做从3点到0点之间的中转点。
设置距离矩阵A[3][0] = 1+3 =4 ,Path矩阵Path[3][0] = 2点,表示从3到0在2点中转,距离最近。
image.png
如图表示(红色单元格),从3到0,最近距离为4,在2点中转 。

依次类推,遍历完二元组集合
image.png

5)选择编号为3的点为中间点,最终结果

依次类推,遍历二元组集合,直到所有的顶点都做过一次中间点为止。
image.png

6)根据最终结果,就可以知道任意2点的最短距离和路径

比如1点到2点怎么走?根据路径Path矩阵,Path[1][2] = 3,表示从点3中转,即 1-> 3 ->2
image.png

6)如果中转点不止1个呢?

有时候不只通过一个点,而是经过两个点或者更多点中转会更短,即a->k1->k2b->或者a->k1->k2…->k->i…->b。
比如顶点1到顶点0,我们看数组Path
Path[1][0] = 3,说明顶点3是中转点,那么再从3到0
Path[3][0] = 2,说明从3到0,顶点2是中转点,然后在从2到0
Path[2][0] = -1,说明顶点2到顶点0没有途径顶点,也就是说,可以由顶点2直接到顶点0,即它们有边连接。

最终,最短路径为1->3->2->0,距离为 A[1][0] = 6 。
显然,这是一个逐层递进,递归的过程。

算法实现

基本定义

    //    表示无穷大 即不可达public static int MAX = Integer.MAX_VALUE;//    距离矩阵public int[][] dist;//    路径Path矩阵public int[][] path;

核心算法

//        核心算法for(int k = 0 ; k < size ; k++){for(int i = 0;i < size;i++){for(int j = 0 ;j < size;j++){
//                判断如果 ik距离可达且 kj距离可达 且 i和j的距离是否大于 i-> k 与 k->j的距离和if( dist[i][k] != MAX &&  dist[k][j] != MAX  &&  dist[i][j] > (dist[i][k] + dist[k][j]) ){path[i][j]= k;dist[i][j]= dist[i][k] + dist[k][j];}}}}

运行结果

image.png

源码下载

Floyd算法java实现-源码下载

Floyd算法java实现

看完这篇文章如果你还不会Floyd,请留言评论。
image.png

转载于:https://www.cnblogs.com/Halburt/p/10756572.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/394113.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java object类的常用子类_Java中Object类常用的12个方法,你用过几个?

前言Java 中的 Object 方法在面试中是一个非常高频的点&#xff0c;毕竟 Object 是所有类的“老祖宗”。Java 中所有的类都有一个共同的祖先 Object 类&#xff0c;子类都会继承所有 Object 类中的 public 方法。先看下 Object 的类结构(快捷键&#xff1a;alt7)&#xff1a;1.…

javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册

一、ServletJSPJavaBean开发模式(MVC)介绍 ServletJSPJavaBean模式(MVC)适合开发复杂的web应用&#xff0c;在这种模式下&#xff0c;servlet负责处理用户请求&#xff0c;jsp负责数据显示&#xff0c;javabean负责封装数据。 ServletJSPJavaBean模式程序各个模块之间层次清晰&…

Log4j配置详解

来自: http://www.blogjava.net/zJun/archive/2006/06/28/55511.html Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的&#xff0c;它可接keyvalue格式的设置或xml格式的设置信息。通过配置&#xff0c;可以创建出Log4J的运行环境。1. 配置文件 …

java swing 串口_ComTest 接收串口数据,并显示在文本框内,通过JavaSwing实现 Develop 265万源代码下载- www.pudn.com...

文件名称: ComTest下载 收藏√ [5 4 3 2 1 ]开发工具: Java文件大小: 3157 KB上传时间: 2016-09-21下载次数: 0提 供 者: 韩坤详细说明&#xff1a;接收串口数据&#xff0c;并显示在文本框内&#xff0c;通过JavaSwing实现-Receive serial data, and displayed in the t…

SQL大圣之路笔记——PowerDesigner之新建table、view、proc

1. 新建table、view、proc 转载于:https://www.cnblogs.com/allenzhang/p/6305564.html

P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm

对于一个牛&#xff0c;它存在两种状态&#xff1a;1.处于联通分量 2.不处于联通分量。对于处于联通分量的牛&#xff0c;求出联通分量的大小&#xff1b;对于不处于联通分量的牛&#xff0c;求出其距离联通分量的路程联通分量大小。 不同的联通分量&#xff0c;染上不同的颜色…

ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(持续更新中...)

开发工具&#xff1a;VS2015(2012以上)SQL2008R2以上数据库 您可以有偿获取一份最新源码联系QQ:729994997 价格 666RMB 升级后界面效果如下&#xff1a; 日程管理 http://www.cnblogs.com/ymnets/p/7094914.html 任务调度系统界面 http://www.cnblogs.com/ymnets/p/5065154.h…

【FRDM-K64F学习笔记】使用ARM mbed和Keil MDK下载你的第一个程序

FRDM-K64F开发平台采用MK64FN1M0VLL12微控制器。该控制器包含一个带有浮点单元的ARM Cortex-M4内核。其最高工作频率为120MHz&#xff0c;具有256KB的RAM、1MB闪存以及许多其他外设。它非常适合大多数可以采用以太网、SD卡存储以及板载模拟-数字转换器的IoT应用。但是&#xff…

php 实时更新内容_亿级视频内容如何实时更新?优酷视频背后的技术揭秘

简介&#xff1a; 优酷视频内容数据天然呈现巨大的网络结构&#xff0c;各类数据实体连接形成了数十亿顶点和百亿条边的数据量&#xff0c;面对巨大的数据量&#xff0c;传统关系型数据库往往难以处理和管理&#xff0c;图数据结构更加贴合优酷的业务场景&#xff0c;图组织使用…

物联网商机迸发 LPWAN芯片现身 本文转自d1net(转载)

联发科技发表首款NB-IoT系统单芯片MT2625。来源&#xff1a;MediaTeK 物联网(IoT)带动的庞大商机吸引各方业者积极投入&#xff0c;尤其是各种联网技术不断现身&#xff0c;争夺各式各样极富发展潜力的应用领域。 根据IDC的调查报告&#xff0c;物联网市场在2017年声势看涨&…

jquery之stop()的用法

工作中遇到过的实际案例&#xff1a; 1、我在项目里做的一个下拉菜单&#xff0c;当鼠标移上去的时候就菜单显示&#xff0c;当鼠标离开的时候菜单隐藏 如果我快速不断地将鼠标移入移出菜单&#xff08;即&#xff0c;当菜单下拉动画未完成时&#xff0c;鼠标又移出了菜单&…

学会这二十个正则表达式,能让你少些1000行代码!

正则表达式&#xff0c;是一个强大且高效的文本处理工具。通常情况下&#xff0c;通过一段表达准确的表达式&#xff0c;能够非常简短、快速的实现复杂业务逻辑。因此&#xff0c;正则表达式通常是一个成熟开发人员的标配&#xff0c;可以辅助实现开发效率的极强提升。在需要实…

为啥JAVA虚拟机不开发系统_理解Java虚拟机体系结构

1 概述众所周知&#xff0c;Java支持平台无关性、安全性和网络移动性。而Java平台由Java虚拟机和Java核心类所构成&#xff0c;它为纯Java程序提供了统一的编程接口&#xff0c;而不管下层操作系统是什么。正是得益于Java虚拟机&#xff0c;它号称的“一次编译&#xff0c;到处…

Android WindowManager和WindowManager.LayoutParams的使用以及实现悬浮窗口的方法

1.理清概念 我们使用过Dialog和PopupWindow,还有Toast,它们都显示在Activity之上。那么我们首先需要理解的是android中是如何去绘制这些UI的呢&#xff1f;这里我只讲我所理解的&#xff0c;首先看一层次图&#xff08;盗用网络&#xff09;首先我们看到左边的Activity层&#…

Java集合中的细节

integer数据对比 对于Integer var ? 在-128至127范围内的赋值&#xff0c;Integer对象是在IntegerCache.cache产生&#xff0c;会复用已有对象&#xff0c;这个区间内的Integer值可以直接使用进行判断&#xff0c;但是这个区间之外的所有数据&#xff0c;都会在堆上产生&…

Android开发系列之屏幕密度和单位转换

由于Android的开源性&#xff0c;所以目前市面上面Android手机的分辨率特别多&#xff0c;这样的话就给我适配带来了一定的难度。要想做好适配&#xff0c;我们首先应该明白什么是分辨率、PPI、屏幕大小等概念&#xff0c;还有在不同的屏幕密度下&#xff0c;各个单位之间的转换…

让机器读懂用户——大数据中的用户画像

让机器读懂用户——大数据中的用户画像 摘要&#xff1a; 用户画像(persona)的概念最早由交互设计之父Alan Cooper提出:“Personas are a concrete representation of target users.” 是指真实用户的虚拟代表&#xff0c;是建立在一系列属性数据之上的目标用户模型。随着互联…

activeMQ在文件上传的应用

本次试验主要用到了activeMq和上传插件uploadify的知识&#xff0c;感谢以下两篇文章的作者。 1.http://itindex.net/detail/47160-java-jquery-%E4%B8%8A%E4%BC%A0 2.http://blog.csdn.net/jiuqiyuliang/article/details/47160259 本文中不再提供activeMq和uploadify的介绍。 …

谢烟客---------Linux之DNS服务系统的基础知识

DNS Domain Name Server1)C/S架构&#xff1a;SOCKET通信IP PORT2&#xff09;应用层协议&#xff1a;资源子网BIND Berkerley Information Name DomainDNS由来1&#xff09;统一名字&#xff0c;自己维护 <自己查询>解析: 基于key查找value: 查询数据库(二维关系的表: …

ES6对象的扩展

1.属性简写表示 2.方法简写表示 属性与方法简写&#xff1a; 3.属性名表达式 ES6允许字面量定义对象时&#xff0c;用方法二&#xff08;表达式&#xff09;作为对象的属性名&#xff0c;即把表达式放在方括号内。 4.Object.is()比较两个值是否严格相等 转载于:https://www.cnb…