目录
回顾Dijkstra算法正确性本质
回顾Dijkstra算法的思想,他是基于贪心的
对于寻找单元最短路,每次找到全图没有加入到dist数组且最小的那个点来更新其他的点
1,为什么最短路只能在正权图上使用?
因为dijkstra算法的贪心确认了每个点只会被更新一次,如果是最短路的话正权图dist只会越来越大,所以能保证这个性质,
但是对于负权图,dist不一定单调增大的,因此这个点不能被确定已经是最终的dist最小的情况
总结:最短路使用dijkstra算法要边权全部为正才能保证每个点只被更新一次
2,对于最长路,能否使用dijkstra?
只要了解dijstra算法的贪心原理,就能发现对于最长路也是可以运用的。
对于最短路,我们要保证边是正的递增,才能保证每次找到的最小的dist再也不会被更新掉
那么对于最长路,我们只要保证dist是越来越小的,才能保证我们每次找到的最大的距离点再也不会被更新掉
那么边权加肯定是不行的,我们可以考虑边权的乘积,且边权在0到1区间里,
因为权值小于1所以每次更新dist会更小,也就确保了,我们每次找到最大的距离点再也不会被更新掉。
3,那么SPFA算法是否可以处理最长路问题?
当然是可以的,因为spfa算法的正确性来源于松弛操作,也就是那个三角不等式迭代更新所有的边,这个操作不管正负乘,都可以实现,所以最长路也是可以的。
总结
加法最小值
1, 无负权边: dijkstra理由
2, 有负边权:spfa
加法最大值
spfa
乘法最小值
1, 边权 >= 1, dijkstra 理由:算法的前提是dist数组里的都是已经确定最小值的,若存在 < 1的话会破坏这个前提。
2. >0 spfa
乘法最大值
1 0 ~ 1 dijkstra
2 > 0 spfa
如果有误,感谢大佬指出。