//假设子程序BFS-MAT(G, s)用于对图G进行BFS,且其原点为s。这里输入的G是以邻接矩阵来存储。 CONSTRUCT-PI(L, W, n) let Π be new n × n matrix V = {1, 2, 3, ..., n} for s = 1 to n E = ∅ for u = 1 to n for v = 1 to n if l_{sv} == l_{su} + w_{uv} E = E ∪ {(u, v)} BFS-MAT((V, E)) for v = 1 to n π_{sv} = v.π return Π
EXTEND-SHORTEST-PATHS'''(L, Π, W, n) let L' be new n × n matrix by ∞ Π' = Π for i = 1 to n for j = 1 to n for k = 1 to n if l'_{ij} > l_{ik} + w_{kj} l'_{ij} = l_{ik} + w_{kj} π'_{ij} = k return L', Π'
SLOW-APSP'''(W, L(0), n) let Π be new n × n matrix by NIL L = L(0) for r = 1 to n - 1 L, Π = EXTEND-SHORTEST-PATHS''(L, Π, W, n) return L, Π
FASTER-APSP'(W, n) let L and M be new n × n matrices L = W r = 1 while r < n - 1 M = ∞ // initialize M EXTEND-SHORTEST-PATHS(L, L, M, n) // compute M = L^2 r = 2r L = M // ready for the next iteration M = ∞ EXTEND-SHORTEST-PATHS(L, L, M, n) for i = 1 to n for j = 1 to n if l_{ij} != m_{ij} return False return True
MINIMUM-NEG-CYCLE(W, L(0), n) let L=(l_{ij}) and M = (m_{ij}) be new n × n matrices L = L(0) // 最短的负环长度可能达到n,需要注意。 for r = 1 to n M = ∞ EXTEND-SHORTEST-PATHS'(L, W, n) L = m for i = 1 to n if l_{ii} < 0 return r // 不存在负环。 return -1
MINIMUM-NEG-CYCLE'(W, n) L = L(1) = W m = 1 k = 1 while k < n or m > 0 M = ∞ if k + m > n m = ⌊m / 2⌋ else if L(m) == NIL L(m) = ∞ EXTEND-SHORTEST-PATHS(L(m/2), L(m/2), L(m), n) EXTEND-SHORTEST-PATHS(L, L(m), M, n) have-neg-cycle = False for i = 1 to n if m_{ii} < 0 have-neg-cycle = True if have-neg-cycle == True m = ⌊m / 2⌋ else L = M k = k + m m = m * 2 if k < n // 找到了负环。 return k + 1 else // 没有找到负环。 return -1