有向图之每一对顶点之间的最短路径

1 上一篇博客介绍了使用迪杰斯特拉算法求某个顶点到其他顶点的最短路径,这一篇介绍使用弗洛伊德(Floyd)算法求每一对顶点之间的最短路径,当然也可以使用迪杰斯特算法来求,求n次就行了。

2 弗洛伊德算法仍从图的带权邻接矩阵出发,其基本思想是:

2.1 假设求从顶点vi到vj的最短路径

2.2 如果从vi到vj有弧,则从vi到vj存在一条长度为arcs[i][j]的路径,该路径不一定是最短的,尚需要进行n次试探。

2.3 首先考虑路径(vi,v0,vj)是否存在(即判断(vi,v0)和(v0,vj)是否存在),如果存在,则比较(vi,vj)和(vi,v0,vj)的路径长度取长度较短者为从vi到vj的中间顶点的序号不大于0的最短路径。

2.4 假设在路径上再增加一个顶点v1,也就是说,如果(vi,....,v1)和(v1,..,vj)分别是当前找到的中间顶点的序号不大于0的路径,那么(vi,...,v1,...,vj)就有可能是从vi到vj的中间顶点的序号不大于1的最短路径。

2.5 将它和已经得到的从vi到vj中间顶点序号不大于0的最短路径相比较,从中选出中间顶点的序号不大于1的最短路径之后,再增加一个顶点v2,继续进行试探。

2.6 以此类推,直到全部求出来。

3 解释

3.1 2.2步应该都明白,那么2.3步什么意思呢?假如vi到vj有直接路径,vi经过v0到vj也有路径,这条路径之可能有这三个顶点,因为v0前面不可能再有顶点了,v0在数组中存储的顺序最靠前,(vi,v0,vj)和(vi,vj)比较,结果肯定是中间顶点不大于0的最短路径。

3.2 2.4步呢?类似2.3步,vi到v1有路径,中间可能会经过v0顶点,v1到vj有路径,中间也有可能经过v0顶点,那么(vi,..,v1,...vj)其实可能是(vi,v0,v1,vj),也有可能是(vi,v1,vj);就是经过的若干顶点中最大的就是v1,不能有比v1大的,求出来的路径就有可能是从vi到vj的中间顶点的序号不大于1的最短路径。

3.3 这样依次类推,依次插入其他顶点。

4 疑惑

例图

有向图之每一对顶点之间的最短路径_第1张图片

 核心代码

for(u=0;uvertnum;u++){

        for(v=0;vvertnum;v++){

            for(w=0;wvertnum;w++){

                if(D[v][u]+D[u][w]//从v经u到w的一条路径更短

                    D[v][w]=D[v][u]+D[u][w];

                    for(i=0;ivertnum;i++){

                        p[v][w][i]=p[v][u][i];

                    }

                }

            }

        }

    }

为什么根据上述的步骤就能求出每一对顶点的最短路径呢?

假如求 a到b的最短路径,如图,a到b有直接路径,但是不一定是最短的,所以要试探在中间依次插入a , b , c , d顶点比较。很明显,依照循环a经过d到b的路径最短。我们可以拨开循环看看,当v=0,w=1,u=2时(即a,c,b,插入a和b时可以忽略不看,对结果没影响),看a到c,c到b的路径,a到c有直接路径,c到b当经过d时才有路径,而这个时候u=2,c到d还没有路径,所以这个肯定比a直接到b的路径长;当v=0,w=1,u=3时,看a到d,d到b的路径,a到d的路径当插入c时就已经求出来了,d到b有直接路径,所以这个时候比较(a,d,b)和(a,b)很明显,前者小。所以a到b的最短路径也求出来了。是不是还有点晕?来看关键点,图上每一对顶点之间的最短路径,都是同步在求,求a到b的最短路径,d到b的最短路径和求a到d的最短路径经过的中间点是一样的(因为u是最外层循环),因为d是最后一个顶点(在数组中存储的按顺序来看),所以a到d和d到b之间的最短路径在前面都已经求出来了,所以这样就能够求出来每一对顶点之间的最短路径(vi到vj的最短路径上需要经过若干顶点,在若干顶点中,位置最大的顶点vx,那么要等到插入这个顶点的时候才能把最短路径求出来,因为vi到vx的最短路径前面插入小的顶点的时候已经求出来了,vx到vj也是)。不管vi到vj的最短路径经过那个顶点,如果这个顶点的位置小,在前面循环就能求出来,如果这个顶点的位置大,在后面的循环能求出来。如下图,是最简单的例图,摸索摸索应该能明白弗洛伊德算法的思路吧。

有向图之每一对顶点之间的最短路径_第2张图片

c语言实现代码: [email protected]:hglspace/GetShortestPath2.git




你可能感兴趣的:(数据结构)