我根据Wikipedia page实现了Floyd-Warshall算法。我想在以下测试图中检测到负周期:
A -1 B
↖
2 -1 -1
↖
D -1 C
所有边缘的权重为-1
,除非D -> A
。
运行路径重建
procedure Path(u, v)
if next[u][v] = null then
return []
path = [u]
while u ≠ v
u ← next[u][v]
path.append(u)
return path
导致无休止的循环,因为到D
的路径是不返回到D
的循环。这是我的next
的内容:
B -> A = C
C -> A = A
D -> A = A
A -> B = B
C -> B = A
D -> B = A
A -> C = B
B -> C = C
D -> C = A
A -> D = B
B -> D = C
C -> D = A
例如,从C
到D
的路径为C -> A -> B -> C -> A -> B ...
,因此将永远不会到达D
,并且Path
中的while循环也不会退出。
我的问题是这是否是预期的行为,并且在运行路径重建时必须检查一些内容。我已经仔细检查了我的实现,在Wikipedia上找不到参考实现之间的任何差异。