day 14 最短路

114 阅读2分钟
  1. 最短路(难点在建图)
    1. 单源最短路
      1. 所有边权均为正数
        1. 朴素Dijkstra算法O(n2n^2) 1. 初始化距离数组dist,表示起点到每个顶点的当前最短距离。初始时,将起点的距离设为0,其他顶点的距离设为无穷大。 2. 初始化一个标记数组visited,用于标记顶点是否被访问过。初始时,所有顶点均未被访问。 3. 重复以下步骤,直到所有顶点都被访问过: a. 选择当前距离最小且未被访问的顶点u。 b. 将顶点u标记为已访问。 c. 更新与顶点u相邻的顶点v的距离,如果经过顶点u到达顶点v的距离更短,则更新顶点v的最短距离dist[v]为dist[u] + w(u, v),其中w(u, v)表示顶点u到顶点v之间的边权重。
        2. 堆优化版Dijkstra算法O(mlogn)
          1. 初始化距离数组dist,表示起点到每个顶点的当前最短距离。初始时,将起点的距离设为0,其他顶点的距离设为无穷大。

          2. 使用最小堆(优先队列)存储顶点及其距离,将起点入队。

          3. 重复以下步骤,直到最小堆为空: a. 从最小堆中取出当前距离最小的顶点u。 b. 如果顶点u已经被访问过,则跳过该顶点。 c. 将顶点u标记为已访问。 d. 遍历顶点u的所有邻接顶点v: - 如果顶点v未被访问过且通过顶点u到达顶点v的距离更短,则更新顶点v的最短距离dist[v]为dist[u] + w(u, v),其中w(u, v)表示顶点u到顶点v之间的边权重。 - 将顶点v及其距离dist[v]入队到最小堆中。 e. 将顶点v及其距离dist[v]入队到最小堆中。