• 最短路径问题-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、算法结束后,图中所有结点之间的最短路径也被计算完成。可以查询到任意两点间的最短距离。

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

  • 相关阅读:
    第13章 子查询和集合运算
    第12章 SQL联接
    第11章 分组函数 ​
    第10章 单行函数 ​
    第15章 RMAN备份 ​
    第1章
    OCP/OCA Oracle 学习001
    Linq之Sum用法新体会
    java中的异常
    android SQLite使用SQLiteOpenHelper类对数据库进行操作
  • 原文地址:https://www.cnblogs.com/tgycoder/p/5018620.html
Copyright © 2020-2023  润新知