Floyd Warshall Algorithm

算法参考地址:Floyd Warshall Algorithm | DP-16 - GeeksforGeeks

算法的简介

Floyd 用于求解所有对最短路径问题。问题在于在给定边加权(可以是负权边)有向图中查找每对顶点之间的最短距离。

时间复杂度: O(V^3)

空间复杂度: O(V^2)

例:

Input:
      graph[][] = { {0,   5, INF, 10},
                  {INF, 0, 3, INF},
                  {INF, INF, 0,   1},
                  {INF, INF, INF, 0} }
which represents the following graph
            10
      (0)------->(3)
      |         /|\
    5 |         |
      |         | 1
      \|/         |
      (1)------->(2)
          3      
Note that the value of graph[i][j] is 0 if i is equal to j
And graph[i][j] is INF (infinite) if there is no edge from vertex i to j.

Output:
Shortest distance matrix
    0     5     8     9
  INF     0     3     4
  INF   INF     0     1
  INF   INF   INF     0

算法的过程

Floyd 算法 我们初始化与输入图矩阵相同的解矩阵作为第一步。然后,我们通过将所有顶点视为中间顶点来更新解矩阵。这个想法是逐个选择所有顶点并更新所有最短路径,其中包括选择的顶点作为最短路径中的中间顶点。当我们选择顶点数 k 作为中间顶点时,我们已经将顶点 {0, 1, 2, .. k-1} 视为中间顶点。对于源顶点和目标顶点的每对 (i, j),有两种可能的情况。 1) k 不是从 i 到 j 的最短路径中的中间顶点。我们保持 disti 的值不变。 2) k 是从 i 到 j 的最短路径中的中间顶点。我们将 disti 的值更新为 disti + distk 如果 disti > disti + distk 下图显示了所有对最短路径问题中的上述最优子结构属性。

算法的实现

golang

// F 代表两点之间不可达
const F = 10000
func floyd(graph [][]int) [][]int {
  n := len(graph)
  dist := make([][]int, n)
  for i := 0; i < n; i++ {
     dist[i] = make([]int, n)
  }
  copy(dist, graph)
  for k := 0; k < n; k++ {
     for i := 0; i < n; i++ {
        for j := 0; j < n; j++ {
           if dist[i][k]+dist[k][j] < dist[i][j] {
              dist[i][j] = dist[i][k] + dist[k][j]
          }
        }
    }
  }
  return dist
}

Java

class Floyd {
   private final static int VERTEX = 7;
   private final static int[][] MATRIX = new int[VERTEX][VERTEX];
   private final static int MAX_VALUE = 100000;

   /**
    * 初始化邻接矩阵
    */
   static void initMatrix() {
       for (int i = 0; i < VERTEX; i++) {
           for (int j = 0; j < VERTEX; j++) {
               MATRIX[i][j] = MAX_VALUE;
          }
      }
  }

   /**
    * 初始化边
    */
   static void initEdge() {
       MATRIX[0][1] = 6;
       MATRIX[0][3] = 2;
       MATRIX[1][2] = 5;
       MATRIX[1][5] = 3;
       MATRIX[3][4] = 5;
       MATRIX[3][1] = 7;
       MATRIX[4][6] = 1;
       MATRIX[5][4] = 2;
       MATRIX[5][2] = 3;
  }

   private static void floyd(int[][] matrix) {
       for (int m = 0; m < matrix.length; m++) {
           for (int i = 0; i < matrix.length; i++) {
               for (int j = 0; j < matrix.length; j++) {
                   if (matrix[i][m] + matrix[m][j] < matrix[i][j]) {
                       matrix[i][j] = matrix[i][m] + matrix[m][j];
                  }
              }
          }
      }
  }

   public static void main(String[] args) {
       initMatrix();
       initEdge();
       //调用算法计算最短路径
       floyd(MATRIX);
  }

}

图最短路径之Floyd的更多相关文章

  1. 经典问题----最短路径(Floyd弗洛伊德算法)(HDU2066)

    问题简介: 给定T条路,S个起点,D个终点,求最短的起点到终点的距离. 思路简介: 弗洛伊德算法即先以a作为中转点,再以a.b作为中转点,直到所有的点都做过中转点,求得所有点到其他点的最短路径,Flo ...

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

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

  3. 最短路径-Dijkstra+Floyd+Spfa

    Dijkstra算法: Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra ...

  4. 图->最短路径->多源最短路径(弗洛伊德算法Floyd)

    文字描述 求每一对顶点间的最短路径,可以每次以一个顶点为源点,重复执行迪杰斯特拉算法n次.这样,便可求得每一对顶点之间的最短路径.总的执行时间为n^3.但是还有另外一种求每一对顶点间最短路径的方法,就 ...

  5. 图的最短路径---弗洛伊德(Floyd)算法浅析

    算法介绍 和Dijkstra算法一样,Floyd算法也是为了解决寻找给定的加权图中顶点间最短路径的算法.不同的是,Floyd可以用来解决"多源最短路径"的问题. 算法思路 算法需要 ...

  6. 图结构练习——最短路径(floyd算法(弗洛伊德))

    图结构练习——最短路径 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述  给定一个带权无向图,求节点1到节点n的最短路径.   输 ...

  7. 图的最短路径算法-- Floyd算法

    Floyd算法求的是图的任意两点之间的最短距离 下面是Floyd算法的代码实现模板: ; ; // maxv为最大顶点数 int n, m; // n 为顶点数,m为边数 int dis[maxv][ ...

  8. 最短路径之Floyd算法

    Floyd算法又称弗洛伊德算法,也叫做Floyd's algorithm,Roy–Warshall algorithm,Roy–Floyd algorithm, WFI algorithm. Floy ...

  9. 最短路径---Dijkstra/Floyd算法

    1.Dijkstra算法基础: 算法过程比prim算法稍微多一点步骤,但思想确实巧妙也是贪心,目的是求某个源点到目的点的最短距离,总的来说dijkstra也就是求某个源点到目的点的最短路,求解的过程也 ...

  10. 数据结构——图——最短路径D&F算法

    一.Dijkstra算法(贪心地求最短距离的算法) 在此算法中,我按照自己的理解去命名,理解起来会轻松一些. #define MAXSIZE 100 #define UNVISITED 0 #defi ...

随机推荐

  1. nginx+uwsgi介绍

    一.nginx+uwsgi介绍 pip list # 查看安装过的模块 rpm -q nginx # 查看是否安装某款服务 pip install django == 1.11.11 # 安装djan ...

  2. SAP集成技术(六)技术、标准和协议

    本文链接:https://www.cnblogs.com/hhelibeb/p/17849837.html 内容摘录自<SAP Interface Management Guide>. W ...

  3. DNS(6) -- DNS子域实现

    目录 1. DNS子域 1.1 子域授权环境说明 1.2 子域授权实现 1.2.1 主域DNS服务器配置 1.2.2 子域DNS服务器配置 1.3 DNS转发域 1.3.1 DNS转发域概述 1.3. ...

  4. Docker推送镜像到Dockerhub

    登录docker hub官网注册账号 https://hub.docker.com/signup 登录账户,创建一个仓库 "Create Repository"--> 输入命 ...

  5. fastposter v2.9.2 最简海报生成器

    fastposter v2.9.2 程序员必备海报生成器 fastposter海报生成器是一款快速开发海报的工具.只需上传一张背景图,在对应的位置放上组件(文字.图片.二维.头像)即可生成海报. 点击 ...

  6. GPS坐标、火星坐标、百度坐标之间的转换--提供java版本转换代码

    参考文章:https://www.jianshu.com/p/c39a2c72dc65?from=singlemessage 1.国内几种常用坐标系说明 (1)名词解释 坐标系统:用于定位的系统,就跟 ...

  7. 1 - 香橙派硬件PWM控制sg90舵机

    本人机械电子专业的大一学生一枚,这是我在博客园的第一篇随笔   2024年4月份我在二手平台花费300大洋入手了香橙派zero3和3B,买回来后一开始是装上ubuntu跑QQ机器人和minecraft ...

  8. 详解Spring循环依赖

    一. 什么是循环依赖 循环依赖,就是两个或则两个以上的bean互相依赖对方,最终形成闭环.比如"A对象依赖B对象,而B对象也依赖A对象",或者"A对象依赖B对象,B对象依 ...

  9. RTMP推流与B帧的关系

    一.H264数据结构 一个原始的H.264 NALU 由一个接一个的 NALU 组成的,而它的功能分为两层,VCL(视频编码层)和 NAL(网络提取层). VCL:包括核心压缩引擎和块,宏块和片的语法 ...

  10. mediaserverd

    1.mediaserverd是什么 mediaserverd(/usr/sbin/mediaserverd)是被root进程launchd启动的一个后台(daemon)进程,其描述文件为com.app ...