<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">一、定义</span>
<span style="font-family: 新宋体; font-size: 14px; orphans: 2; text-align: -webkit-auto; widows: 2; background-color: rgb(255, 255, 255);"> 最短路径定义:在图中假设边有权值,从一点u到另一点v,如果有多条路径,其中路径权值和最小的路径是最短路径(一条路径的权值等于这条路径上所有边权值加和)</span>
单源点最短路径定义:给定一个源点s,求s到所有点的最短路径。
二、解决的问题
Dijkstra解决的是单源点最短路径问题,解决的是满足特定条件的图的最短路径问题,条件如下:
1. 边权值 >= 0
Dijkstra算法是选出的最短路径权值是递增的,如果出现负权值的边,Dijkstra不能保证结果正确。
三、用到的技术
松弛:
最短路径算法都用到“松弛”技术,即是否能对当前s到v的距离进行改善?表示为:if d[v] > d[u]+w[u,v],不同算法对边松弛的次数和顺序不同。
四、算法详解
给出算法描述(参考<<算法导论>>第三版P383)
Dijkstra(G,w,s)
1 INITIALIZE-SINGLE-SOUREC(G,s)
2 S=
Ø
3 Q=G.V
4 while Q!=
Ø
5 u=EXTRACT-MIN(Q)
6 S=S
∪{u}
7 for each vertex v∈G.adj[u]
8 RELAX(u,v,w)
符号解释:
INITIALIZE-SINGLE-SOUREC(G,s): 初始化操作,主要是两点,使源点s到所有顶点距离d[s,v]等于∞,以及对指示顶点是否已得到最短路径的数组finished[i]置false,(特别的: 初始化d[s] = 0)
S: 大S表示已经得到最短路径的顶点集合
Q: 表示还未得到最短路径的顶点集合
s: 小s表示源点
EXTRACT-MIN(Q): 从未得到最短路径的顶点集合中选出一个当前d[s,v]最小的顶点v',
v'就是这一轮选出的顶点,表示
v'已经找到最短路径
RELAX: 进行松弛操作,查看是否存在更短的路径,改善距离d[v]
算法解释:
第1行:初始化
第2行:已得到最短路径顶点集合S置空
第3行:未得到最短路径顶点集合Q初始化为图中所有顶点