spfa:
使用已经更新过的节点去更新其他节点(包括已经被更新过的节点),一个节点可以多次入队(被更新过的节点,在更新过其他节点后还可以被更新)
dijkstra:
使用已经更新过的节点中距离起点距离最小的点去更新其他没被更新过的节点,一个节点只能入队一次(被更新过的节点,在更新过其他节点后不会再被更新)
———————————————————————————————————————————
朴素版spfa(bellman-ford算法)
基本思路:
n次迭代,每一次循环所有边(a,b,w,边a,b权重为w),执行dist[a]=min(dist[b],dist[a]+w)
这个更新操作称为:松弛操作
循环结束后一定满足三角不等式:dist[a]<=dist[b]+w
此算法迭代k次的含义为,不超过k条边,到达某个点的最短距离
据此,我们可以知道,当第n次更新后的值与n-1次更新不同时,图中就有负环。
所以bellman_ford算法可以用来判断负环
时间复杂度为O(nm)
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<