一,Floyed-Warshall算法的思想
Floyed-Warshall算法(以下简称FW)用一种不同的动态规划公式来解决所有结点对的最短路径问题,有向图的权值可以为负,但不能存在负值环路。与25.1中的方法不同的是,25.1中是通过每次拓展一条边,而FW算法则是用已知最短路径的(i,k)和(k,j)的值来算出(i,j)的最短路径。
二,FW算法的递归定义
若k=0,dij(k)=wij;若k>=1,dij(k)=min(dij(k-1),dik(k-1)+dkj(k-1));也就是说,D(0)=W,第k个最短路径权重矩阵D(k)的每个元素应该是D(k-1)对应元素的值与D(k-1)中i到k的最短路径加上k到j的最短路径中的最小值。
三,FW算法的伪代码
FLOYD-WARSHALL(W)
1. n=W.rows
2. D(0)=W
3. for k=1 to n
4. letD(k)=(dij(k))be a new n*n matrix
5. for i=1 to n
6. for j=1 to n
7. dij(k)=min(dij(k-1),dik(k-1)+dkj(k-1))
8. return D(n)
第1-2行中,令n等于初始矩阵W的行数,并构建了一个最短路径权重矩阵D,让它初始为W;第3-7行中,有三个循环,k循环从1到n,表示对D(1)到D(n)共n个矩阵的遍历,内层的两个循环遍历矩阵D(k)的每个元素,让其满足递归定义;第8行返回最终矩阵D(n)