Floyd-Warshall算法

输入是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=iD(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)时的各顶点间的最短路径权值的矩阵。

你可能感兴趣的:(算法)