给定一个有向无加权的acylic图,我试图调整Floyd-Warshall算法来计算2个顶点之间的路径数。我的代码目前看起来像这样:
表示1到n中的所有k 对于所有我在1到n 对于1到n中的所有j Aij = Aij +(Aik * Akij)。
因此,我没有检查和替换最小距离,而是执行以下操作:
i
,j
)之间没有k
+的路径数(从i
到k
的路径数量*来自{{的路径数量1}} * k
)
我的最终数组应该有任意2个顶点之间的路径数。
我无法证明这不会给我两个顶点之间的简单路径计数,但是没有建议在其他地方使用这种方法。
有人可以提供失败的反例吗?
PS:这不是我的作业,而只是我选择的编程练习。
答案 0 :(得分:5)
在无向无加权的acylic图中,任意两个顶点之间最多有1条路径。如果有更多不同的路径,它们会创建一个循环。 (在编辑问题后不相关)
对于有向图,我没有看到您的算法有问题。在this paper中实际提到了修改的Floyd-Warshall算法的用法。它没有被广泛使用的原因可能是它的复杂性 - O(n 3 )与this simple approach的O(m + n)相比
答案 1 :(得分:2)
在循环图形情况下,使用直接Floyd-Warshall算法无法做到这一点,因为计算简单路径需要您跟踪您去过的地方。动态编程假定计算的状态只是递归状态的函数,在这种情况下不是这样。
但是,我不明白为什么不会工作。但是为什么使用Floyd-Warshall来计算两个顶点(只使用DFS或BFS)。