问题
用Floyd Warshall算法求图G=<V,E>中任意两顶点vi,vj之间的最短距离。
解法
设G(i,j)为顶点vi到vj的边的距离,二维数组dist(i,j)表示从顶点vi到顶点vj的最短距离。
初始时,任意顶点vi到自己的距离为0(即dist(i,i)=0),vi到其他顶点的距离为无穷大;
dist(i,j)={0+∞i=ji=j 对于图G中任意两顶点vi,vj,遍历图中的所有其他顶点,尝试进行松弛操作。若存在顶点vk满足:
dist(i,j)>dist(i,k)+dist(k,j) 则更新vi,vj之间的最短距离:
dist(i,j)=dist(i,k)+dist(k,j) 遍历任意两顶点,更新最短距离,最终可得图G中任意两顶点间的最短距离。该算法时间复杂度为O(∥V∥3)。
Introduction To Algorithms
源码
FloydWarshall.h
FloydWarshall.cpp
测试
FloydWarshallTest.cpp