FloydWarshall FloydWarshall算法

问题

用Floyd Warshall算法求图G=<V,E>G = <V, E>中任意两顶点vi,vjv_i, v_j之间的最短距离。

解法

G(i,j)G(i,j)为顶点viv_ivjv_j的边的距离,二维数组dist(i,j)dist(i,j)表示从顶点viv_i到顶点vjv_j的最短距离。

初始时,任意顶点viv_i到自己的距离为0(即dist(i,i)=0dist(i,i) = 0),viv_i到其他顶点的距离为无穷大;

dist(i,j)={0i=j+ijdist(i,j) = \begin{cases} 0 & i = j \\ + \infty & i \neq j \end{cases}

对于图GG中任意两顶点vi,vjv_i, v_j,遍历图中的所有其他顶点,尝试进行松弛操作。若存在顶点vkv_k满足:

dist(i,j)>dist(i,k)+dist(k,j)dist(i,j) > dist(i,k) + dist(k,j)

则更新vi,vjv_i, v_j之间的最短距离:

dist(i,j)=dist(i,k)+dist(k,j)dist(i,j) = dist(i,k) + dist(k,j)

遍历任意两顶点,更新最短距离,最终可得图GG中任意两顶点间的最短距离。该算法时间复杂度为O(V3)O(\| V \| ^3)

Introduction To Algorithms

源码

FloydWarshall.h

FloydWarshall.cpp

测试

FloydWarshallTest.cpp

Last updated