最短路径
- 单源最短路径(Dijstra算法)
- 任意点对之间的最短路径(Floyd算法)
路径上的第一个顶点为源点(Sourse),最后一个顶点为终点(Destination)
Dijstra算法
- 给定一个带权图G=<V,E>,其中每条边(vi,vj)上的全W[vi,vj]是一个非负实数。另外,给定V中的一个顶点s充当源点。
- 现在要计算从源点s到所有其他各项顶点的最短路径,这个问题通常被称为单源最短路径(single-source shortest paths)问题。
- Dijkstra算法是一种按路径长度递增的次序产生到各顶点最短路径的贪心算法。
- 如果v0到vj的最短路径为:
V0→Vx1→Vx2→Vxn→Vi→Vj - 则V0→Vx1→Vx2→Vxn→Vi→Vj是V0到Vi的最短路径。
- 按长度顺序产生最短路径时,下一条最短路径总是由一条已产生的最短路径加上一条边形成。
Dijstra算法基本思想
- 集合S表示最短距离已确定的顶点集合
- 其余的顶点放在另一个集合V-S中
- 数组D来记录当前所找到的从源点s到每一个顶点的最短特殊路径长度。
- 从尚未确定最短路径的集合V-S中选取出一个最短特殊路径长度最小的顶点u,将u加入到集合S中,同时修改数组D中由s可达的最短路径长度。
Dijstra算法基本步骤
- D的初始化状态为:如果从源点s到顶点v有弧则D[v]记为弧的权值; 否则将D[v]置为无穷大。
- 每次从尚未确定最短路径长度的集合V-S中选取出一个最短特殊路径长度最小的顶点u,将u加入集合S,同时修改数组D中由s可达的最短路径长度:若加进u做中间顶点,使得vi的最短特殊路径长度变短,则修改Vi的距离值(即当D[u]+W[u,vi]<D[vi]时,令D[vi]=D[u]+W[u,vi])
- 然后重复上述操作,一旦S包含了所有V中的顶点,D中各顶点的距离值就记录了从源点到该顶点的最短路径长度。
Dijstra算法复杂度
- 注意该算法要求图中不存在负权值回路
- 空间复杂度取决于存储方式,邻接矩阵为O(n2)。
- 时间复杂度去取决于求权值最小边的方法:
- 采用最小堆来选择权值最小的边,你们每次改变最短特殊路径长度时需要对堆进行一次重排,此时的时间复杂度为O((n+e)loge),适用于稀疏图。
- 通过直接比较D数组元素,确定代价最小的边就需要总时间O(n2);取出最短特殊路径长度最小的顶点后,修改最短特殊路径长度共需要时间O(e),因此共需要花费**O(n2)**的时间,这种适合求稠密图