最短路径问题

一、最短路径问题的抽象

在网络中,求两个不同顶点之间的所有路径中,边的权值之和最小的那一条路径

  • 这条路径就是两点之间的最短路径(Shortest Path)
  • 第一个顶点为源点(Source)
  • 最后一个顶点为终点(Destination)

二、问题分类

单源最短路径问题:从某固定源点出发,求其到所有其他顶点的最短路径。

  • (有向)无权图
  • (有向)有权图

多源最短路径问题:求任意两项顶点间的最短路径。

三、无权图的单源最短路算法

按照递增(非递减)的顺序找出到各个顶点的最短路

一层一层找点

四、有权图的单源最短路算法

按照递增的顺序找出到各个顶点的最短路径(Dijkstra算法)

  • 令S={源点S+已经确定了最短路径的顶点vi}
  • 对任一未收录的顶点v,定义dist[v]为s到v的最短路进长度,但该路径仅经过s中的顶点。即路径{s->(Vi∈S)->v}的最小长度
  • 若路径是按照递增(非递减)的顺序生成的,则
    • 真正的最短路径必须只经过S中的顶点(为什么?)
    • 每次从未收录的顶点中选一个dist最小的收录(贪心)
    • 增加一个v进入s,可能影响另外一个w的dist值!
      • dist[w]  = min{dist[w], dist[v] + <v, w>的权重}

五、多源最短路算法

方法1:直接将单源最短路算法调用|V|遍

  • T=O(|V|3+|E|x|V|)            对于稀疏图效果好

 方法2:Floyd算法

T=O(|V|3)                             对于稠密图效果好

Floyd算法

  • Dk[i][j] = 路径{ i -> { l ≤ k }  -> j }的最小长度
  • D0, D1, …, D|V|-1[i][j]即给出了ij的真正最短距离
  • 最初的D-1是什么?
  • Dk-1已经完成,递推到Dk时:
    • 或者k ¢ 最短路径{ i -> { l ≤ k } -> j },则Dk = Dk-1
    • 或者k ¢ 最短路径{ i -> { l ≤ k } -> j },则该路径必定由两段最短路径组成Dk[i][j]=Dk-1[i][k]+Dk-1[k][j]

 

 

 

猜你喜欢

转载自www.cnblogs.com/ch122633/p/8976288.html