day 14 最短路(二)

105 阅读1分钟
  1. 单源最短路存在负边权
    1. Bellman-Ford O(nm)
      1. 基本思路:
        1. 初始化距离数组dist,表示起点到每个顶点的当前最短距离。初始时,将起点的距离设为0,其他顶点的距离设为无穷大。
        2. 进行n-1次迭代(n为顶点数量): a. 遍历图中的每条边(u, v),如果通过顶点u到达顶点v的路径长度dist[u] + w(u, v)小于顶点v当前的最短距离dist[v],则更新dist[v]为dist[u] + w(u, v)。
        3. 检查是否存在负权回路: a. 再次遍历图中的每条边(u, v),如果存在通过顶点u到达顶点v的路径长度dist[u] + w(u, v)小于顶点v当前的最短距离dist[v],则说明存在负权回路。
        4. 输出最短路径距离dist,即起点到每个顶点的最短距离。
    2. SPFA一般O(m) 最坏O(nm)
      1. 基本思路:
        1. 初始化距离数组dist,表示起点到每个顶点的当前最短距离。初始时,将起点的距离设为0,其他顶点的距离设为无穷大。
        2. 将起点加入队列。
        3. 重复以下步骤,直到队列为空: 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加入队列。
        4. 输出最短路径距离dist,即起点到每个顶点的最短距离。