目录
Dijkstra
采用贪心策略的带权重的有向图上单源最短路径算法
要求所有边的权重为非负值
算法维护一个数组dist保存源点到各个顶点的最短距离
和一个保存已经找到了最短路径的顶点集合T
算法步骤:
- 初始化:源点到源点的dist设为0,源点到邻边的dist设为边权值,源点到其他点的dist设为正无穷,T初始只有源点s
- dist数组选择最小值对应的点u加入T中,并更新u的相邻点v到s的dist的值:比较dist(s,v)和dist(s,u)+dist(u,v)的值
- 重复操作直到所有的点被加入T中
如果最后得到的dist存在正无穷值,代表源点到该点不可达
所以可以用来判断两点是否可达
根据最小优先队列的实现,有不同的时间复杂度
Floyd
多源最短路径算法
维护dist(i,j)二维数组
算法步骤:
- 对于任意一条边,遍历其他的所有点,比较是否经过该点可以得到更短的路径
时间复杂度:O(n^3)
Bellman-Ford
允许负权边的出现
算法维护每个点的数组dist[u],其中dist[s]=0,其他的点为∞
算法步骤:
- 遍历所有的边,更新边的尾部端点的dist值,当dist[v]>dist[u]+w[u,v]时
- 重复步骤1共n-1次
- 判断是否有负权环路:dist[v]>dist[u]+w[u,v]即还满足一的条件但是没有更新的,返回False
SPFA
Bellman-Ford+队列优化
算法步骤:
- 源点s入队
- 取出队头,遍历出边,进行松弛,将松驰过且不在队列中的点加入队列(用于更新其他的点)
- 直到队列为空
判断负权环路:
某个点进入队列的次数超过N次则存在负环