Floyd算法求单源最短路(图,数据结构)

  1. 什么是单源最短路?
    给定一个图和图中的一个点,求该点到其余各点的最短距离。

  2. Floyd算法思路:计算某点到其余各点的距离,可先求该点到其中一个点的距离,其他各点类似。假设求i点到j点的距离,跳点为空时,最短距离就是i到j的最短距离,跳点为1时,最短距离为D[i][j] = min{D[i][j],D[i][1]+D[1][j]},跳点为1和2时,最短距离为D[i][j]=min{D[i][j],D[i][2]+D[2][j]},依次类推。这里不用考虑为什么没有比较i->1->2->j这条路线,因为1为跳点时,已经将i从1到其他各点的距离都已经求出了,如果i->1->2这条路线的长度比i->2的路线长度小的话,D[i][2]就是对应的i->1->2这条路线的长度,i->2->j同i->1->2->j相比,2->j距离已定,i->1->2和i->2已经取了较小者,所以另一条一定比选取的距离大,不用再比较了。

  3. Floyd代码实现:
void GetShortestPath_Floyd(MGraph &G,DistanceMatrix &D)
{
    //初始化D,根据图G,有路径的初始化为权值,没有的初始化为无穷大
    for(int i = 1;i <= G.vexnum; ++i)
    {
        D[i][j] = G.arcs[i][j];
    }

    for(int k = 1;k <= G.vexnum; ++k)
    {//第一层循环是可选择的跳点
        for(int i = 1; i <= G.vexnum; ++i)
        {//第二层循环是起点
            for(int j = 1; j <= G.vexnum; ++j)
            {//第三层循环是终点
                D[i][j] = min(D[i][j],D[i][k] + D[k][j]);

            }
        }
    }
}
  • Floyd算法较简洁,易懂。但是用到了邻接矩阵而且有三层循环,对于空间复杂度和时间复杂度有一定的要求。
  • Floyd算法也是一种动态规划,把问题分成几个阶段,一个阶段一个阶段的解决问题,最终的结果建立在这几个阶段的结果之上。

你可能感兴趣的:(数据结构,图,数据结构,算法)