输入是n*n的矩阵W,输出是各顶点间的最短路径权值的矩阵D(n)。D(k)表示中间节点限制为(1,2,…,k)时的各顶点间最短路径权值矩阵,d(i,j,k)表示D(k)中点对(i,j)的最短路径权值。
FLOYD-WARSHALL(W)
n=rows(W)
for k=1 to n
for i=1 to n
for j=1 to n
d(i,j,k)=min(d(i,j,k-1),d(i,k,k-1)+d(k,j,k-1))
return D(n)
数学归纳法证明其正确性:
问题:证明采用以上代码,D(k)表示中间节点为(1,2,...,k)时的各顶点间的最短路径权值的矩阵。(当k=n时,即结果)
证明:D(0)初始化为直接相连的顶点之间的权值,也即表示无中间节点的情况。
假设当k=i,D(k)表示中间节点为(1,2,...,i)时的各顶点间的最短路径权值。
则当k=i+1,
若点i不是点对(m,n)最短路径的中间节点,则显然d(i,j,k)= d(i,j,k-1)。
若点i是点对(m,n)最短路径的中间节点,则点对(m,n)之间的最短路径可以分解为(m,k),(k,n)之间的最短路径。则必然有d(i,j,k)= d(i,k,k-1)+d(k,j,k-1)。
于是可以看到,D(k)表示中间节点为(1,2,...,k)时的各顶点间的最短路径权值的矩阵。