我必须解决以下问题:编写一个程序,给定带有成本和两个顶点的有向图,找到给定顶点之间的最低成本步行,或者如果图中存在负成本周期则打印一条消息。程序应使用矩阵乘法算法。
我实现了定义的矩阵乘法算法:伪矩阵乘法,其中加法被最小化替换,乘法加法。但通过这样做,我最终得到了Floyd-Warshall算法。另外,我不能通过这种方式轻松确定负成本周期的存在。
我认为我的算法和实际矩阵乘法图算法之间存在重大差异,但究竟是什么呢?
答案 0 :(得分:1)
https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm#Behavior_with_negative_cycles
尽管如此,如果存在负面循环,那么Floyd-Warshall 算法可用于检测它们。直觉如下:
- Floyd-Warshall算法迭代地修改所有顶点对(i,j)之间的路径长度,包括i = j;
- 最初,路径(i,i)的长度为零;
- 路径[i,k,...,i]只有在长度小于零的情况下才能改进,即表示负循环;
- 因此,在算法之后,如果存在从i回到i的负长度路径,则(i,i)将为负。
两种算法之间存在一些差异:
矩阵算法可以找到具有特定边数的最小路径(例如,找到边数为< = k的所有顶点对之间的最小路径),FW不能。
矩阵乘法算法需要额外的O(n ^ 2)空间,Floyd-Warshall可以就地使用。
矩阵乘法算法具有O(n ^ 3 * log(n))复杂度repeated squaring或O(n ^ 4),实现简单,Floyd-Warshall复杂度为O(n ^ 3)