对于一个带有负权值的有向图 G(V,E),我搜索了一些类似的主题,似乎Bellman-Ford算法可以检测负环。但是一旦发现负环,它就会停止,那么在这种情况下我们如何列出所有负环呢?
根据Eric Lippert的建议,我尝试从图中删除一旦找到的负环,但我感觉这不正确,为什么?因为在删除循环后,图形会发生变化,并且旧图中可能存在额外的非负循环,但在新图中不会被发现。请问有人能帮我澄清这个问题吗?
这可以在Java或C#中实现(我更喜欢C#)。
谢谢
对于一个带有负权值的有向图 G(V,E),我搜索了一些类似的主题,似乎Bellman-Ford算法可以检测负环。但是一旦发现负环,它就会停止,那么在这种情况下我们如何列出所有负环呢?
根据Eric Lippert的建议,我尝试从图中删除一旦找到的负环,但我感觉这不正确,为什么?因为在删除循环后,图形会发生变化,并且旧图中可能存在额外的非负循环,但在新图中不会被发现。请问有人能帮我澄清这个问题吗?
这可以在Java或C#中实现(我更喜欢C#)。
谢谢
嗯,你肯定不能高效地找到它们:考虑完全图上的n
个顶点,每条边的权重为负-1。在这个图中有指数级数量的负权重环,因此仅列出它们就需要指数时间!
如果这并不阻止你,你最好应用任何旧的查找循环算法,例如这个问题中的算法,以找到所有循环,然后只丢弃那些带有非负权重的循环。
n
的循环:显然有(n-1)!
条长度为n-1
的简单路径从该节点出发,我们只需添加从路径结束到原点的边缘以形成一个循环。因此,通过原点存在(n-1)!
个大小为n
的循环,这是指数数量。 - Andy Jones