day 14 最短路(二)
- 单源最短路存在负边权
- Bellman-Ford O(nm)
- 基本思路:
- 初始化距离数组dist,表示起点到每个顶点的当前最短距离。初始时,将起点的距离设为0,其他顶点的距离设为无穷大。
- 进行n-1次迭代(n为顶点数量): a. 遍历图中的每条边(u, v),如果通过顶点u到达顶点v的路径长度dist[u] + w(u, v)小于顶点v当前的最短距离dist[v],则更新dist[v]为dist[u] + w(u, v)。
- 检查是否存在负权回路: a. 再次遍历图中的每条边(u, v),如果存在通过顶点u到达顶点v的路径长度dist[u] + w(u, v)小于顶点v当前的最短距离dist[v],则说明存在负权回路。
- 输出最短路径距离dist,即起点到每个顶点的最短距离。
- SPFA一般O(m) 最坏O(nm)
- 基本思路:
- 初始化距离数组dist,表示起点到每个顶点的当前最短距离。初始时,将起点的距离设为0,其他顶点的距离设为无穷大。
- 将起点加入队列。
- 重复以下步骤,直到队列为空: a. 从队列中取出一个顶点u。 b. 将顶点u标记为未在队列中。 c. 遍历顶点u的所有邻接顶点v:
- 如果通过顶点u到达顶点v的路径长度dist[u] + w(u, v)小于顶点v当前的最短距离dist[v],则更新dist[v]为dist[u] + w(u, v)。
- 如果顶点v未在队列中,则将顶点v加入队列。
- 输出最短路径距离dist,即起点到每个顶点的最短距离。