📜  DAA | Floyd-Warshall算法

📅  最后修改于: 2020-12-10 07:03:19             🧑  作者: Mango

Floyd-Warshall算法

令G的顶点为V = {1,2 …. n},并考虑某个k的顶点的子集{1,2 …. k}。对于任意一对顶点i,j∈V,考虑从i到j的所有路径,这些路径的中间顶点都从{1,2 ….. k}得出,其中p是其中的最小权重路径。 Floyd-Warshall算法利用路径p和从i到j的最短路径之间的链接,其中所有中间顶点都在{1,2 ….. k-1}中。链接取决于k是否为路径p的中间顶点。

如果k不是路径p的中间顶点,则路径p的所有中间顶点都在集合{1,2 …… k-1}中。因此,从顶点i到顶点j且集合{1,2 …….. k-1}中有所有中间顶点的最短路径也是到顶点j且集合{1中有所有中间顶点的最短路径,2 ……. k}。

如果k是路径p的中间顶点,则将p分解为i→k→j。

令d ij (k)为从顶点i到顶点j的最短路径的权重,其中所有中间顶点都在{1,2 ….. k}中。

递归定义为

Floyd-Warshall算法采用的策略是动态规划。 Floyd-Warshall算法的运行时间由3-6行循环的三重嵌套确定。第6行的每次执行花费O(1)时间。该算法因此在时间θ(n 3 )中运行。

示例:应用Floyd-Warshall算法构造最短路径。证明由Floyd-Warshall算法为图计算的矩阵D (k)和π (k)。

解:

步骤(i)当k = 0时

步骤(ii)当k = 1时



步骤(iii)当k = 2


步骤(iv)当k = 3


步骤(v)当k = 4



步骤(vi)当k = 5