dijkstra算法关于负权值的问题

原理

dijkstra由于是贪心的,每次都找一个距源点最近的点(dmin),然后将该距离定为这个点到源点的最短路径(d[i]<–dmin);但如果存在负权边,那就有可能先通过并不是距源点最近的一个次优点(dmin’),再通过这个负权边L(L<0),使得路径之和更小(dmin’+L

举例

dijkstra算法关于负权值的问题_第1张图片
1.从A点出发
2.首先找到距A最近的且直接相连的点,有B跟C,A到C更短,所以先把C标记
3.再寻找C点的下一个邻居,没有邻居
4.找到距A次近的且未被标记的点B,标记B
5.找出B的邻点C,A-B-C的距离成了1,但是不能去更新,因为C是标记了的,按照dij远的点是不能松弛近的点的,所以不能松弛。
好,程序结束,结果为A到C的距离为2,跟答案不同。说明也不能用dij来处理带负权边的有向图。

参考链接

https://zhidao.baidu.com/question/61824427.html.
https://blog.csdn.net/baidu_31818237/article/details/50611592.
最近在学习基础的算法,看了大佬的理解,很透彻

你可能感兴趣的:(dijkstra算法关于负权值的问题)