每一对顶点之间的最短路径问题——Floyd(弗洛伊德)算法

引言:
  解决这个问题的一个办法是:每次以一个顶点为源点,重复执行Dijkstra算法n次。这样便可求得每一对顶点之间的最短路径。总的时间复杂度为O(n^3)。
  这里要介绍的由弗洛伊德提出的另一个算法。时间复杂度也是O(n^3),但是形式上简单些。
 
一、算法思想:
    主要用来求用四阶方阵表示的图中没两个顶点之间的最短路径的过程。
  引进两个辅助矩阵D,path[]
    D:用来记录当前已经求得的任意两个顶点最短路径的长度。
    path:用来记录当前两个顶点间最短路径上要经过的中间顶点。
 
二、伪代码如下:
 1 #define MAXSIZE 100
 2 void ShortestPath_Floyd(MGraph G, int path[][MAXSIZE], int D[][MAXSIZE]){
 3     int i,j,k;
 4     /*这个两重for循环对数组D和path进行了初始化*/
 5     for(i = 0; i < G.vertex_num; ++i)
 6         for(j = 0; j < G.vertex_num; ++j){
 7             D[i][j] = G.edges[i][j];
 8             path[i][j] = -1;
 9         }//for
10     /*初始化结束,下面这个三重for循环是主要操作,完成了以k为中间结点对所欧的顶点<i,j>进行检测和修改*/
11     for(k = 0; k < G.vertex_num; ++k)
12         for(i = 0; i <  G.vertex_num; ++i)
13             for(j = 0; j <  G.vertex_num; ++j){
14                 D[i][j] = D[i][k] + D[k][j];
15                 path[i][j] = k;
16             }//for
17 }//ShortestPath_Floyd

 

三、算法性能分析:
  时间复杂度:
    本算法主要是一个三重循环,取最内层循环作为基本操作,基本操作的次数为(v^3)。
    使用邻接矩阵表示时,时间复杂度为O(V^3)。
  注意:
    Floyd算法允许图中带负权值的边,但不允许包含带负权值的边组成回路。
    Floyd算法同样适用于带权无向图,因为带权无向图可视为权值相同往返二重边的有向图。
posted @ 2021-11-28 18:30  某科学的撒把豆子  阅读(271)  评论(0)    收藏  举报