Algorithm 我能用Dijkstra算法处理负权图吗?

Algorithm 我能用Dijkstra算法处理负权图吗?,algorithm,graph-theory,dijkstra,Algorithm,Graph Theory,Dijkstra,我知道Bellman-Ford算法可以很好地处理负权重图,但我开发了一个Dijkstra算法代码,它工作得非常好。但当我插入负加权边时,它失败了。有解决方案吗?我认为我们不能这样做,因为Dijkstra算法无法找到到达目标顶点的最终方法,因为它可能会陷入循环,它不是为负权重图设计的,你应该选择bellman-ford算法我认为我们不能这样做,由于Dijkstra算法不会找到到达目标顶点的最终方法,因为它可能会卡在循环中,它不是为负权重图设计的,所以您应该使用bellman-ford算法,实际上,

我知道Bellman-Ford算法可以很好地处理负权重图,但我开发了一个Dijkstra算法代码,它工作得非常好。但当我插入负加权边时,它失败了。有解决方案吗?

我认为我们不能这样做,因为Dijkstra算法无法找到到达目标顶点的最终方法,因为它可能会陷入循环,它不是为负权重图设计的,你应该选择bellman-ford算法

我认为我们不能这样做,由于Dijkstra算法不会找到到达目标顶点的最终方法,因为它可能会卡在循环中,它不是为负权重图设计的,所以您应该使用bellman-ford算法,实际上,在特殊情况下是可能的。如果存在负长度的边,则将失败。但是,如果所有边的长度均为负值,则可以反转所有边的长度,并使用该算法查找图形两个顶点之间的最长路径(该路径将表示原始图形中的最短路径)


但在一般情况下,正如你所说的,不可能使用Dijkstra。如果没有负长度的循环,则应使用Bellman-Ford算法。如果你不能保证没有负长度的循环,那么这个问题就是NP完全问题,并且没有已知的多项式算法。

实际上,在特殊情况下是可能的。如果存在负长度的边,则将失败。但是,如果所有边的长度均为负值,则可以反转所有边的长度,并使用该算法查找图形两个顶点之间的最长路径(该路径将表示原始图形中的最短路径)


但在一般情况下,正如你所说的,不可能使用Dijkstra。如果没有负长度的循环,则应使用Bellman-Ford算法。如果你不能保证没有负长度的循环,那么这个问题就是NP完全问题,并且没有已知的多项式算法。

正如你所说的,Bellman Ford是寻找负权重图中最短路径的首选算法。在这种情况下使用Dijkstra算法的问题是,Dijkstra假设图中从s到t的所有可能子路径都必须小于目标子路径,这在添加负边权重时不一定是真的。

如您所述,Bellman-Ford是寻找负权重图中最短路径的首选算法。在这种情况下使用Dijkstra算法的问题是,Dijkstra算法假设图中从s到t的所有可能的子路径都必须小于目标子路径,这在添加负边权重时不一定是真的。

如果所有边权重都为正,这就保证了向路径添加更多边会使路径更长。知道了这一点,Dijkstra的算法将丢弃到某个顶点的任何比它找到的最短路径长的路径,因为长路径不可能比短路径短


但是,如果存在负边权重,则该假设不成立,因为我们可能会有一条我们丢弃的非常长的路径p,但在道路的某个地方,p可以通过一条非常负的边,并变得比您当前拥有的最短路径短。因此,我们不能保证我们找到的路径在Dijkstra算法所依赖的任何阶段都是最短的。

如果所有边权重都为正,这就保证了向路径添加更多边会使路径更长。知道了这一点,Dijkstra的算法将丢弃到某个顶点的任何比它找到的最短路径长的路径,因为长路径不可能比短路径短


但是,如果存在负边权重,则该假设不成立,因为我们可能会有一条我们丢弃的非常长的路径p,但在道路的某个地方,p可以通过一条非常负的边,并变得比您当前拥有的最短路径短。因此,我们不能保证我们找到的路径在Dijkstra算法的任何阶段都是最短的,该算法依赖于Dijkstra算法。

我认为这是不可能的。你可以看看这个问题,如果你的图是DAG(有向无环图),你可以使用它。我认为这是不可能的。你可以看看这个问题,如果你的图是DAG(有向无环图),你可以使用它。做得好,谢谢你的链接。。。。。我从来都不知道,Thanx非常出色的工作,谢谢你的链接。。。。。我从来都不知道这件事,因为特例是Thanx