最短路径问题抽象
-
典型用途:交通网络问题——从甲地到乙地是否有公路连通?在有许多条公路连通的情况下,哪一条最短?
- 交通网络用有向网表示:
顶点——表示地点
弧——表示两个地点有路连通
弧上的权值——表示两地点之间的距离、交通费或途中所花费的时间的等。
如何能够使一个地点到另一个地点的运输时间最短或运费最省?这就是一个求两个地点的最短路径问题。
- 交通网络用有向网表示:
-
问题抽象: 在有向网中A点(源点)到达B点(终点)的多条路径中,寻找一条各边权值之和最小的路径,即最短路径。
最短路径与最小生成树不同,路径上不一定包含n个顶点,也不一定包含n-1条边。
通常最短路径问题可分为以下两类:-
第一类:两点间最短路径
知道源点(v1)和终点(v7),找到一条最短路径(图中蓝色边)。 -
第二类:某源点到其他各点最短路径
知道源点(v1),求到其他各顶点的最短路径(如表所示)。
-
-
两种常用算法:
- 单源最短路径(第一类问题)——Dijkstra算法
- 所有结点间的最短路径(第二类问题)——Floyd算法
Dijkstra算法
-
算法思路:
- 1.把顶点集合V分成两组:
- (1) S:已求出最短路径的顶点的集合
- (2) T=V-S:尚未确定最短路径的顶点集合
- 2.将T中顶点按最短路径递增的次序加入到S中,并要满足以下两个条件:
- (1)从源点到S中各顶点的最短路径长度都不大于从到T中任何顶点的最短路径长度。
- (2) 每个顶点对应一个距离值:
S中的顶点:从 到此顶点的最短路径长度
T中的顶点:从 到此顶点的只包括S中顶点作中间顶点的最短路径长度。
- 1.把顶点集合V分成两组:
-
算法步骤:
- 1.初始时,令,T中顶点对应的距离值用辅助数组D存放。
D[i]的初值: 若存在,则为其权值;否则为。 - 2.从T中选取一个距离值最小的顶点,加入S。
对T中顶点的距离值进行修改:若加进作中间顶点,从到的距离值比不加的路径要短,则修改此距离值。 - 3.重复上述步骤,直至S=V为止。
- 1.初始时,令,T中顶点对应的距离值用辅助数组D存放。
-
例子说明:
1.初始状态如下图,此时,。
2.从T中找一个距离值最小的结点加入到S集合中,,修改距离值。
3.从T中找一个距离值最小的结点加入到S集合中,,修改距离值。
4.从T中找一个距离值最小的结点加入到S集合中,,修改距离值。
5.从T中找一个距离值最小的结点加入到S集合中,,修改距离值。
6.从T中找一个距离值最小的结点加入到S集合中,,修改距离值。
6.从T中找一个距离值最小的结点加入到S集合中,,修改距离值。此时,S=V,结束。
Floyd算法
-
算法思想:
- 逐个顶点试探
- 从到的所有可能存在的路径中
- 选出一条长度最短的路径
-
算法步骤:
- 初始时置一个n阶方阵,令其对角线元素为0,若存在弧,则对应元素为权值;否则为 。
- 逐步试着在原直接路径中增加中间结点,若加入中间结点后路径变短,则修改之;否则,维持原值。所有顶点试探完毕,算法结束。
-
例子说明:
1.初始时,如下图,
2.加入结点A,进行试探,
3.加入结点B,进行试探,
4.加入结点C,进行试探,
5.此时,所有顶点试探完毕,算法结束。