Dijkstra算法不能处理负权边的解释


Dijkstra算法不能处理负权边,刚开始我只知道有这么个说法,但是却没有实例证明,这次成功证明,看上面这个图,现在要算出A到D的最短路径,通过Dijkstra算法首先松弛出B,C,B最短,然后把B的出边进行松弛,B被标记为处理过,然后再次选出C,对C的出边进行松弛,此时B虽然进行了松弛,但是前面已经被标记处理过了,所以最后算出来的最短路径为35,但是实际上最短路径为33,那就使用贝尔曼-福德算法吧。

因为Dijkstra是这样假设的:对于处理过的结点,没有前往该结点的更短路径,这种假设仅仅在没有负权边时才能成立。

猜你喜欢

转载自blog.csdn.net/zhouzi2018/article/details/80689133