algorithm - 调整 Floyd-Warshall 算法来检测周期

标签 algorithm graph-theory floyd-warshall

干杯,我正在尝试解决有向图中的最小长度循环问题,并且我遇到了一个解决方案,该解决方案建议我应该调整 Floyd-Warshall 算法来解决该问题。它指出,我不应该设置 path[i][i] = 0 我应该设置 path[i][i] = INFINITY,但我不太明白为什么会这样!我发现Floyd-Warshall使用的数组的主对角线没有改变,那么它如何帮助我看到循环的路径?我知道算法生成的数组可以帮助我找到一对的最短路径。例如path[i][j] 给出了从 ij 的最短路径,但是,尽管直觉保持不变,但我发现什么也没有改变,我无法得到想要的结果。

我什至尝试使用此网站 here 可视化该过程,我生成了一个图,其中包含许多循环,但是尽管对角线初始化为无穷大,但它并没有改变。谁能解释我缺少什么或者我可以做些什么来解决我的问题?

最佳答案

对于有向图,其想法是您只需更改 path 矩阵,这样就不需要存储从 i 的最短路径的长度j, path[i][j] 存储最短非空路径的长度,即它只包含至少有一条边的路径。当然,这只影响从顶点到自身的路径。

所以现在,我们用infinity而不是0来初始化path[i][i],因为我们当时还没有找到任何非空路径顶点到其自身。

然后,根据边初始化矩阵的其余部分后,我们进行正常的 Floyd-Warshall 迭代:

for k in |V|:
    for j in |V|:
        for i in |V|:
            path[i][j] = min(path[i][j], path[i][k] + path[k][j])

假设有一个简单的循环 1 -> 2 -> 1。然后,当 (i,j,k) == (1,1,2) 时,我们执行 路径[1][1] = min(路径[1][1], 路径[1][2] + 路径[2][1])

这会将 path[1][1]无穷大更改为循环长度。

如果您修改了一个实现,但它没有执行此操作,那么该实现可能已优化为完全忽略对角线。

关于algorithm - 调整 Floyd-Warshall 算法来检测周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72043824/

相关文章:

graph-theory - 循环和电路有什么区别

algorithm - 为什么使用逆阿克曼函数来描述 Kruskal 算法的复杂性?

c++ - 使用 Floyd 算法找到最短路径

algorithm - 颠倒的弗洛伊德-沃歇尔

c# - 最大递增序列

algorithm - 树的深度和直径有什么区别?

python - 查找有向图中的所有前驱节点

c - OpenCL 中并行 Floyd Warshall 算法的输出错误

C,西格玛的时间复杂度?

algorithm - 根据不同的边类型计算图距离