求赋权图 G = (V, E , F )中任意两点间的最短路的Warshall-Floyd 算法:设 A = (aij )n×n 为赋权图G = (V, E , F )的矩阵, 当vivj∈E 时aij = F (vivj), 否则取aii =0, aij= +∞(i≠j ), dij 表示从vi 到vj 点的距离, rij 表示从vi 到vj 点的最短路中一个点的编号.
① 赋初值. 对所有i, j, dij = aij, rij = j. k = 1. 转向②
② 更新 dij, rij . 对所有i, j, 若dik + dk j<dij, 则令dij = dik + dk j, rij = k, 转向③.
③ 终止判断. 若dii<0, 则存在一条含有顶点vi 的负回路, 终止; 或者k = n 终止; 否则令k = k + 1, 转向②.最短路线可由 rij 得到.
例解:用Warshall-Floyd 算法, MATLAB 程序代码如下:
D=A; %赋初值
for(i=1:n)for(j=1:n)R(i,j)=j;end;end %赋路径初值
for(k=1:n)for(i=1:n)for(j=1:n)if(D(i,k)+D(k,j)<D(i,j))D(i,j)=D(i,k)+D(k,j); %更新dij
R(i,j)=k;end;end;end %更新rij
k %显示迭代步数
D %显示每步迭代后的路长
R %显示每步迭代后的路径
pd=0;for i=1:n %含有负权时
if(D(i,i)<0)pd=1;break;end;end %存在一条含有顶点vi 的负回路
if(pd)break;end %存在一条负回路, 终止程序
end %程序结束