问题描述
我一直在研究加权有向图的图算法,尤其是针对所有对最短路径问题的 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 算法?
解决方法
我假设路径的带宽 P 是 P 中边的最低成本。
如果您使用 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 幂,因此最短路径将优先考虑最小化最大权重,因为这也会最小化总权重。这相当于避免了原始问题中的最窄路径,这正是我们想要的。