我看到有人说Floyd-Warshall可以(轻松)修改以检测周期。注意:我假设图表没有负循环。我想知道如何修改算法?为什么这是正确的?此外,你可以检测到什么周期?最长,最长,长度为k? - 您需要对算法进行哪些调整?
我读到这个问题,让我开始思考这个问题: Find cycle of shortest length in a directed graph with positive weights
对于上面的链接,我不明白为什么做adj的对角线。 matrix = INFINITY给出了通过(i,i)的最短长度的循环。
最后,这个网站:http://en.algoritmy.net/article/45708/Floyd-Warshall-algorithm 表示:
Floyd-Warshall algorithm can be easily modified to detect cycles.
If we fill negative infinity value at the diagonal of the matrix and run the
algorithm, then the matrix of predecessors will contain also all cycles in the graph
(the diagonal will not contain only zeros, if there is a cycle in the graph).
所以我不认为我理解这一点,因为这似乎是错误的,因为如果记忆对我来说是正确的,那么检测所有周期都不能在多边形时间内完成。我误解了所说的内容吗? (另外,不确定前辈矩阵是什么意思。)
答案 0 :(得分:0)
我相信前辈的矩阵是计算从任何顶点到任何其他顶点的距离的最终结果,F_ij =从节点i到节点j的最短路径的长度,如果没有路线则为0。如果邻接矩阵的对角线被设置为无穷大,则它有效地禁止自循环,因此F_ii可以是非零的唯一方式是如果存在从节点i到其自身通过至少一个其他节点(即循环)的路径。通常,任何路径寻找算法都可以变成循环寻找算法。取你想要找到循环的节点,比如说v,然后把它分成两个节点v_out和v_in,v-out只有v的边缘,而v_in只有v的边缘。现在用算法查找从v_out到v_in的路径,如果将v_out和v_in合并回v,这将成为一个循环。