zoukankan      html  css  js  c++  java
  • 最短路径问题-Floyd算法

    概念

    最短路径也是图的一个应用,即寻找图中某两个顶点的最短路径长度。

    实际应用:例如确定某两个城市间的坐火车最短行车路线长度等。

    Floyd algorithm

    中文名就是弗洛伊德算法。

    算法思路:用邻接矩阵来存储图的结构,edge[i][j]表示从结点i到结点j的最短路径长度,那么该如何计算edge[i][j]呢?首先我们可以假设当前的edge[i][j]不是最短的路径长度,必须经过k结点,比较edge[i][i]与edge[i][k]+edge[k][j]的大小(其中k的取值为所有点的编号),如果前者小,则表明i到j的最短路径为当前的edge[i][j];如果后者小,那么就需要修改当前的edge[i][j],使得edge[i][i]=edge[i][k]+edge[k][j]。

    ok,下面用代码表示一下:

    for (int k = 1; k <= n; k++)
        {
            for (int i = 1; i <= n; i++)
            {
                for (int j = 1; j <= n; j++)
                {
                    if (edge[i][k] == MAX || edge[k][j] == MAX)
                        continue;
                    if (edge[i][j] == MAX || edge[i][k] + edge[k][j] < edge[i][j])
                        edge[i][j] = edge[i][k] + edge[k][j];
                }
            }
        }

    上面的三层循环就是Floyd算法的核心内容,其时间复杂度为O(n3)。

    Floyd算法特点

    1、时间复杂度按为O(n3),所以要求被求解的图的顶点个数不能大于200个,否则容易超时。

    2、利用二维矩阵来进行存储图的结构,并进行相关计算。

    3、算法结束后,图中所有结点之间的最短路径也被计算完成。可以查询到任意两点间的最短距离。

    与迪杰斯特拉算法比较一下,前者主要是求图中某一顶点到其余各顶点的最短路径,后者主要是求图中任意两点间的最短路径。在实际应用中要学会灵活应用。

  • 相关阅读:
    Golang的math包常用方法
    部署tomcat部署实战案例
    CentOS 7.6操作系统部署JDK实战案例
    Linux防火墙iptables命令管理入门
    Docker镜像-基于DockerFile制作编译版nginx镜像
    使用Docker快速部署Mysql服务器
    Docker镜像-基于DockerFile制作yum版nginx镜像
    Docker镜像-手动制作yum版nginx镜像
    Docker容器操作基础命令
    Docker镜像管理篇
  • 原文地址:https://www.cnblogs.com/tgycoder/p/5018620.html
Copyright © 2011-2022 走看看