1 问题描述

何为Floyd算法?

Floyd算法功能:给定一个加权连通图,求取从每一个顶点到其它所有顶点之间的最短距离。(PS:其实现功能也称完全最短路径问题)

Floyd算法思想:将顶点i到j的直接距离依次与顶点i到顶点j之间加入k个中间节点之后的距离进行比较,从中选出最短的一组距离,即为顶点i到顶点j的最短距离,然后重复上述步骤求取其它顶点之间的最短距离。

2 解决方案

2.1 使用Floyd算法得到最短距离示例


此处借用《算法设计与分析基础》第3版上一个插图:

其中,

D(0)表示不包含中间节点,即给定图的原始权重矩阵;

D(1)表示加入一个中间节点a;

D(2)表示在D(1)的基础上再加入一个中间节点b;

D(3)表示在D(2)的基础上再加入一个中间节点c;

D(4)表示在D(3)的基础上再加入一个中间节点d,这时就可得到最终结果。

每次加入一个中间节点后,都要更新所有顶点之间的最短距离,直到所有顶点均可以作为中间顶点之后,才算更新完毕,即可得到最终结果。

2.2 具体编码

Floyd是计算每对顶点间最短路径的经典算法,其采用的思想是动态规划法。

时间复杂度是雷打不动的O(n^3)。

注意,Floyd算法计算最短距离可以有负权值的边,但不能有权值和为负数的回路。

下面代码中所用图的数据便是2.1中示例图的数据。

package com.liuzhen.chapter9;

public class Floyd {
/*
* 参数adjMatrix:给定连通图的权重矩阵,其中权重为-1表示两个顶点不能直接相连
* 函数功能:返回所有顶点之间的最短距离权重矩阵
*/
public void getShortestPaths(int[][] adjMatrix) {
for(int k = 0;k < adjMatrix.length;k++) {
for(int i = 0;i < adjMatrix.length;i++) {
for(int j = 0;j < adjMatrix.length;j++) {
if(adjMatrix[i][k] != -1 && adjMatrix[k][j] != -1) {
int temp = adjMatrix[i][k] + adjMatrix[k][j]; //含有中间节点k的顶点i到顶点j的距离
if(adjMatrix[i][j] == -1 || adjMatrix[i][j] > temp)
adjMatrix[i][j] = temp;
}
}
}
}
} public static void main(String[] args) {
Floyd test = new Floyd();
int[][] adjMatrix = {{0,-1,3,-1},
{2,0,-1,-1},
{-1,7,0,1},
{6,-1,-1,0}};
test.getShortestPaths(adjMatrix);
System.out.println("使用Floyd算法得到的所有顶点之间的最短距离权重矩阵为:");
for(int i = 0;i < adjMatrix.length;i++) {
for(int j = 0;j < adjMatrix[0].length;j++)
System.out.print(adjMatrix[i][j]+" ");
System.out.println();
}
}
}

运行结果:

使用Floyd算法得到的所有顶点之间的最短距离权重矩阵为:
0 10 3 4
2 0 5 6
7 7 0 1
6 16 9 0

java实现Floyd算法的更多相关文章

  1. Floyd算法(三)之 Java详解

    前面分别通过C和C++实现了弗洛伊德算法,本文介绍弗洛伊德算法的Java实现. 目录 1. 弗洛伊德算法介绍 2. 弗洛伊德算法图解 3. 弗洛伊德算法的代码说明 4. 弗洛伊德算法的源码 转载请注明 ...

  2. Floyd算法java实现demo

    Floyd算法java实现,如下: https://www.cnblogs.com/Halburt/p/10756572.html package a; /** * ┏┓ ┏┓+ + * ┏┛┻━━━ ...

  3. 算法笔记_069:Floyd算法简单介绍(Java)

    目录 1 问题描述 2 解决方案 2.1 使用Floyd算法得到最短距离示例 2.2 具体编码   1 问题描述 何为Floyd算法? Floyd算法功能:给定一个加权连通图,求取从每一个顶点到其它所 ...

  4. 最短路径—Dijkstra算法和Floyd算法

    原文链接:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最后边附有我根据文中Dijkstra算法的描述使用jav ...

  5. Floyd算法(一)之 C语言详解

    本章介绍弗洛伊德算法.和以往一样,本文会先对弗洛伊德算法的理论论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 弗洛伊德算法介绍 2. 弗洛伊德算法图解 3 ...

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

    简介 Floyd-Warshall算法(Floyd-Warshall algorithm),是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似.该算法名称以 ...

  7. 数据结构与算法--最短路径之Floyd算法

    数据结构与算法--最短路径之Floyd算法 我们知道Dijkstra算法只能解决单源最短路径问题,且要求边上的权重都是非负的.有没有办法解决任意起点到任意顶点的最短路径问题呢?如果用Dijkstra算 ...

  8. 深度解析(一六)Floyd算法

    Floyd算法(一)之 C语言详解 本章介绍弗洛伊德算法.和以往一样,本文会先对弗洛伊德算法的理论论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 弗洛伊德 ...

  9. hdu 1599 find the mincost route (最小环与floyd算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1599 find the mincost route Time Limit: 1000/2000 MS ...

随机推荐

  1. Mockito不能mock final类的解决办法

    Mockito是很常用的测试工具,使用过程中可能会遇到下面的问题: Mockito cannot mock/spy because : - final class 问题重现: 引入该依赖到项目的mav ...

  2. 力扣题解-面试题10- II. 青蛙跳台阶问题

    题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总共有多少种跳法. 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008, ...

  3. EM算法和GMM算法的相关推导及原理

    极大似然估计 我们先从极大似然估计说起,来考虑这样的一个问题,在给定的一组样本x1,x2······xn中,已知它们来自于高斯分布N(u, σ),那么我们来试试估计参数u,σ. 首先,对于参数估计的方 ...

  4. 解决 Loaded plugins: fastestmirror

    其大概意思是fastestmirror不能使用,fastestmirror是yum的一个加速插件,具体我也没有仔细了解过,可能是系统不支持或者缺少组建导致的.处理办法就是禁用这个插件,方法如下:roo ...

  5. 24个经典的MySQL索引问题,你都遇到过哪些?

    索引 1.什么是索引? 2.索引有哪些优缺点? 3.索引使用场景(重点) 4.索引有哪几种类型? 5.索引的数据结构(b树,hash) 6.索引的基本原理 7.索引算法有哪些? 8.索引设计的原则? ...

  6. 「雕爷学编程」Arduino动手做(40)——旋转编码器模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

  7. React:Conditional Rendering(条件渲染)

    就像JS中常常会根据条件(比如if/else.switch)返回不同的值,React中也可以根据组件的状态或其他参考条件返回不同的React Element. 比如根据用户是否登陆渲染对应的UI面板. ...

  8. 原生js获取元素的各种位置(大全)

    加给元素: offsetLeft (距离定位父级的距离) offsetTop (距离定位父级的距离) offsetWidth (可视宽度) offsetHeight (可视高度) clientLeft ...

  9. asp中设置session过期时间方法总结

    http://www.jb51.net/article/31217.htm asp中设置session过期时间方法总结 作者: 字体:[增加 减小] 类型:转载   asp中默认session过期时间 ...

  10. HDU3746 Cyclic Nacklace

    题目链接:https://vjudge.net/problem/HDU-3746 知识点: KMP 解题思路: 论如何用 \(Next[]\) 数组求循环节. AC代码: #include <b ...