Floyd算法 Java实现
Floyd算法 Java实现
- 算法导入
- 算法核心
- 代码实现
- 参考资料
- 结尾
算法导入
在上一篇博客中,咱讲述了求单源最短路径的一种经典算法 Dijkstra 算法,想了解的同学可以走前门瞅一瞅,记得回来哈。
经典Dijkstra算法 Java实现
但是因为算法的局限性,一是不能处理非负权图,二是只能处理单源到其他点的最短路径。有些小伙伴肯定不满意了呀!别急,今天咱介绍另一种的算法,Floyd算法,而且实现极其简单,for就完事了。先上图,咱梳理一下最短路中各种算法的差异。
算法核心
Floyd算法的核心思想为动态规划,动态规划是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题。最简单的动态规划,斐波纳契数列,也叫兔子数列(兔子繁殖例子)1,1,2,3,5,8,13,21…。
对于上面的数列,我们可以首先确定边界条件是 F(0) = 1, F(1) = 1, 当 n >= 2时,F(n) = F(n - 1) + F(n-2)。当转移方程确定后,就能够方便的求出后者了。
那么在Floyd算法中,定义一个数组 f[k][x][y]
表示 只允许经过 结点1到 k,结点 x到 y的最短路径长度
,也就是说,当 k = 6
时,可能 x - 1 - y
最短,也可能 x - 2 - 5 - 3 - y
最短,在满足条件下,f[k][x][y] = min(最短路径)
。假设有n个结点,编号1 - n,那么可以确定:
f[n][x][y]
:结点 x 到 y 的最短路径。f[0][x][y]
:不经过任何结点,x -> y
的最短路径。若两者直接相连,x -> y = w(x, y)
最短路径为权值,或者两者不直接相连,为正无穷
。
确定边界条件之后,我们来确定转移方程,对于任何一个f[k][x][y]
, 有两种到达方式:
- 不经过 第
k
个结点,那么f[k][x][y] = f[k - 1][x][y]
; - 经过 第
k
个结点了,那么f[k][x][y] = f[k - 1][x][k] + f[k - 1][k][y]
; - 两者取最小值。
那么最终的转移方程即可确定 f[k][x][y] = min(f[k-1][x][y], f[k-1][x][k] + f[k-1][k][y] )
可以看到 如果顺序求值,第一维对结果并没有影响,那么可以转变为:f[x][y] = min(f[x][y], f[x][k] + f[k][y])
。
转移方程有了,边界条件有了,那么代码就水到渠成了。
代码实现
import java.util.*;/*** @author LKQ* @date 2022/4/21 18:52* @description Floyd算法,适用于任何图,且不管有向无向,边权正负。但是最短路必须存在* 时间复杂度为O(n^3),适用于稠密图,即 m(边的数量) 约等于 n^2 (点的数量)*/
public class Solution {/*** 邻接矩阵存储*/int[][] graph;int INF = Integer.MAX_VALUE / 2;/*** 多源最短路算法* @param n n个结点 编号 0 - n-1* @param edges 边 e[0] - e[1] 的权值为 e[2]*/public void floyd(int n, int[][] edges) {// 1. 初始化邻接矩阵graph = new int[n][n];for (int i = 0; i < n; i++) {// 点到其他点的距离为无穷大Arrays.fill(graph[i], INF);// 点到自身的距离为0graph[i][i] = 0;}// 注意有向图和无向图的区别,无向图 u -> v,v -> u 都要设置,有向图 只要设置 u -> vfor(int[] e: edges) {graph[e[0]][e[1]] = e[2];graph[e[1]][e[0]] = e[2];}// floyd 基本流程为三层循环:// 枚举中转点 - 枚举起点 - 枚举终点 - 松弛操作for (int k = 0; k < n; k++) {for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {graph[i][j] = Math.min(graph[i][j], graph[i][k] + graph[k][j]);}}}}
}
核心代码只有三个for循环,是不是很简单
没骗你们吧。但是要注意一点,由于时间复杂度为 O(n^3),而且空间复杂度 为 O(n ^ 2),当点较多时,那么就有可能造成 TLE 或 MLE ,做题目的时候尤其需要小心。
参考资料
OI Wiki
图灵程序设计丛书 算法 第4版
结尾
琅琅书声如春风,拂过千年时空
少年啊壮志在胸, 赋首词让人感动
许嵩 / 孙涛 《书香年华》
Floyd算法 Java实现相关推荐
- POJ3615(Cow Hurdles)图论-Floyd算法JAVA高速IO外挂!
POJ3615(Cow Hurdles) 图论-Floyd算法JAVA高速IO外挂! package classical_algorithm.graph.FloydWarshall; //http:/ ...
- java floyd_百度百科里面的floyd算法java的代码,总是无法运行。请问是代码有问题吗,如何编译啊?...
展开全部 不能编译运行的说法是错误,但是结果是否正确,我就32313133353236313431303231363533e59b9ee7ad9431333335303539不知道了,我不懂这个算法p ...
- floyed java_Floyd算法java实现demo
Floyd算法java实现,如下: package a; /** * ┏┓ ┏┓+ + * ┏┛┻━━━┛┻┓ + + * ┃ ┃ * ┃ ━ ┃ ++ + + + * ████━████ ┃+ * ...
- 【最短路径Floyd算法详解推导过程】看完这篇,你还能不懂Floyd算法?还不会?...
简介 Floyd-Warshall算法(Floyd-Warshall algorithm),是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似.该算法名称以 ...
- 图论最短路径算法 Java实现
Dijkstra和Floyd算法 Java实现 Dijkstra算法 Dijkstra算法改进 优先队列实现 Floyd算法 Dijkstra算法 问题描述: 单源最短路径问题 public clas ...
- 牛客网 最短路 Floyd算法 Dijkstra算法 Java大数
链接:https://www.nowcoder.com/questionTerminal/a29d0b5eb46b4b90bfa22aa98cf5ff17 来源:牛客网 最短路径 热度指数:2992 ...
- 【Java数据结构与算法】第二十章 Dijkstra算法和Floyd算法
第二十章 Dijkstra算法和Floyd算法 文章目录 第二十章 Dijkstra算法和Floyd算法 一.Dijkstra算法 1.介绍 2.代码实现 二.Floyd算法 1.介绍 2.代码实现 ...
- Floyd算法(java)
一.Floyd算法简介 Floyd算法是求解每对顶点之间的最短路径,时间复杂度为O(∣V∣3)O(|V|^3)O(∣V∣3). 二.Floyd算法思想 Floyd算法的基本思想是: 递推产 ...
- floyd算法java_利用JAVA和Floyd算法实现上海地铁最短路线搜索系统
[实例简介] Floyd算法基于JAVA实现上海地铁最短路线搜索系统,图形界面,支持新建删除站点以及新建线路. [实例截图] [核心代码] SUBWAY └── SUBWAY ├── bin │ ...
最新文章
- 刻意练习:LeetCode实战 -- Task23. 不同的二叉搜索树 II
- 【转】Loadrunner入门(《软件性能测试过程详解与案例剖析》)
- numpy reshape resize用法
- html 多行多列列表格,HTML跨多行跨多列表格.doc
- 牛客 - 阔力梯的树(树上启发式合并)
- 利用栈进行程序的括号匹配
- SPOJ-New Distinct Substrings,注意会爆int
- 软件架构(10)---java资深架构师分布式技术分享
- 股市太火 !“牛市”搜索热度暴涨9倍:80后疯狂开户
- java hql 连接查询,java – 如何从HQL表单中的两个连接表查询中选择*?
- initramfs 根文件系统
- 新流星搜剑录服务器维护,一梦江湖1月15日更新内容介绍
- 10款视频转码软件的H264低码率高画质转码评测
- JAVA 的成员变量和局部变量
- chrome浏览器收藏夹恢复
- HTML之在JavaScript中定义函数
- 计算机所有计算都是在内存,计算机的所有计算都是在内存中进行的
- ISO26262标准
- MPOS in Retail (Dynamics 365 for Operation)
- 五种方法让你的软文像新闻
热门文章
- 论文精度笔记(五):《Micro-YOLO: Exploring Efficient Methods to Compress CNN based Object Detection Model》
- 流媒体后视镜方案关键技术--失效模式控制
- 互联网行业薪资现状,月薪2万属于低收入? 6千外派包吃住
- Spring Cloud底层原理(转载 石杉的架构笔记)
- win10VS+QT/OpenCV/灰点相机配置及其使用
- 微信官方提供的生成二维码接口得到的是当前公众号的二维码
- Mirai登陆QQ的登陆验证过程
- C语言字符串string.h详解
- 寻找第(前)k大的数的方法总结
- 3d动画用云渲染靠谱吗?