最宽路径的 Floyd-Warshall 算法

问题描述

我一直在研究加权有向图的图算法,尤其是针对所有对最短路径问题的 Floyd 算法。这是我的伪代码实现。

让 G 是一个带节点 {1,...,n} 和邻接矩阵 A 的加权有向图。让 B_k [i,j] 是从 i 到 j 的最短路径,它使用中间节点

input A

if i = j then set B[i,j] = 0
  set B[i,j] = 0
else if i != j && there is an arc(i,j)
  set B[i,j] = A[i,j]
else 
  set B[i,j] = infinity

#B = B0
for k = 1 to n:
  for i = 1 to n:
    for j = 1 to n:
      b_ij = min(b_ij,b_ik + b_kj)
return B

我想知道这个算法(复杂度 O(n^3))是否可以适应具有相似复杂度的最宽路径算法:

给定一个加权的有向图(G,W),对于每对节点 i,j 找到从 i 到 j 的路径的带宽最大带宽。如果没有从 i 到 j 的路径,我们返回 0。

谁能给我一个伪代码算法,该算法适用于最宽路径问题的 Floyd-Warshall 算法?

解决方法

我假设路径的带宽 PP 中边的最低成本。

如果您使用 b_ij = max(b_ij,min(b_ik,b_kj)) 而不是 b_ij = min(b_ij,b_ik + b_kj),您可以解决最宽路径问题。此外,“无路径”初始化 set B[i,j] = infinity 必须更改为 set B[i,j] = -infinity

演示实际上与原始问题相同:将前 k 个顶点归纳为中间顶点。运行时间未修改:ϴ(n^3).

,

您可以通过扩充图来使用 F-W 算法

您可以更改边的权重,使它们都是 2 的唯一幂,并与原始权重相反。

也就是说,给定下图(作为加权邻接矩阵):

0  3  2
16 0  1
5  8  0

我们将其转换为:

0  8  16
1  0  32
4  2  0

我们现在可以简单地使用 Floyd-Warshall 在这个新图上找到最短路径,这将是原始图上最宽的路径。

要看到这一点,请注意,任何 2 的幂都大于所有较低的 2 幂,因此最短路径将优先考虑最小化最大权重,因为这也会最小化总权重。这相当于避免了原始问题中的最窄路径,这正是我们想要的。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...