350 likes | 697 Views
数据结构 第八章 图 8.6 单源最短路径. 生活中常见的“ 最短路径 ”问题. 单源最短路径问题. 单源最短路径 : 给定有向图 G 和源点 v ,求 v 到 G 中其余各 顶点的最短路径。. 相关概念. 算法思想. 数据结构及组织. Dijkstra 算法设计与实现. 算法分析. 课堂练习. A. B. C. D. E. F. ¥. ¥. ¥. 8. A. é. ù. 0. 5. 30. E. B. ê. ú. ¥. ¥. ¥. 2. 0. 8. B.
E N D
单源最短路径问题 单源最短路径:给定有向图G和源点v,求v到G中其余各 顶点的最短路径。 相关概念 算法思想 数据结构及组织 Dijkstra算法设计与实现 算法分析 课堂练习
A B C D E F ¥ ¥ ¥ 8 A é ù 0 5 30 E B ê ú ¥ ¥ ¥ 2 0 8 B 2 4 ê ú 15 ê ú ¥ ¥ ¥ C 15 0 7 ê ú D A 18 D ¥ ¥ ¥ ¥ ¥ 0 30 ê ú ê ú ¥ ¥ ¥ ¥ E 4 0 5 10 ê ú F ¥ ¥ ¥ ê ú 10 18 0 ë û F C 7 单源最短路径—基本概念 路径长度:一条路径上所经过的边的数目 带权路径长度:路径上所经过边的权值之和 最短路径:(带权)路径长度(值)最小的那条路径 最短路径长度或最短距离:其(带权)路径长度 (a)有向带权图; (b)邻接矩阵
单源最短路径--算法思想 距离源点 最近的一个结点是? 源 有n个结点的网络
单源最短路径--算法思想 距离源点 最近的一个结点是? 第二近的是? 源 有n个结点的网络
单源最短路径--算法思想 距离源点 最近的一个结点是? 第二近的是? 第三近的会出现在那些路径上? 源 有n个结点的网络
单源最短路径--算法思想 距离源点 最近的一个结点是? 第二近的是? 第三近的会出现在那些路径上? 路径冲突怎么办? 源 有n个结点的网络
单源最短路径--算法思想 接下去,距离源点 第4、第5….第n近的结点? Dijkstra求解单源最短路径思想: 按从某顶点到其它顶点的路径长度递增的方式,逐渐求到各顶点的最短路径。 源 有n个结点的网络
单源最短路径--算法思想 设给定源点为Vs,S为已求得最短路径的终点集,开始时令S={Vs} 。当求得第一条最短路径(Vs ,Vi)后,S为{Vs,Vi} 。根据以下结论可求下一条最短路径。 设下一条最短路径终点为Vj ,则Vj只有: ◆源点到终点有直接的弧<Vs,Vj>; ◆从Vs 出发到Vj 的这条最短路径所经过的所有中间顶点必定在S中。即只有这条最短路径的最后一条弧才是从S内某个顶点连接到S外的顶点Vj。 若定义一个数组dist[n],其每个dist[i]分量保存从Vs 出发中间只经过集合S中的顶点而到达Vi的所有路径中长度最小的路径长度值,则下一条最短路径的终点Vj必定是不在S中且值最小的顶点,即: dist[i]=Min{ dist[k]| Vk∈V-S } 利用上述公式就可以依次找出下一条最短路径。 源
Dijkstra单源最短路径算法--数据组织 • 数据源 • 已确定结点集 S • 待选结点集 V-S • 结点临时最短路径长度 • 结点临时最短路径 源 有n个结点的网络
A B C D E F ¥ ¥ ¥ 8 A é ù 0 5 30 E B ê ú ¥ ¥ ¥ 2 0 8 B 2 4 ê ú 15 ê ú ¥ ¥ ¥ C 15 0 7 ê ú D A 18 D ¥ ¥ ¥ ¥ ¥ 0 30 ê ú ê ú ¥ ¥ ¥ ¥ E 4 0 5 10 ê ú F ¥ ¥ ¥ ê ú 10 18 0 ë û F C 7 Dijkstra算法--数据组织 • 数据源 —— 邻接矩阵 • 已确定结点集 S • 待选结点集 V-S • 结点临时最短路径长度 —— Distance数组 • 结点临时最短路径 —— Path数组 图 邻接矩阵 单源最短路径运算过程表
A B C D E F ¥ ¥ ¥ 8 A é ù 0 5 30 E B ê ú ¥ ¥ ¥ 2 0 8 B 2 4 ê ú 15 ê ú ¥ ¥ ¥ C 15 0 7 ê ú D A 18 D ¥ ¥ ¥ ¥ ¥ 0 30 ê ú ê ú ¥ ¥ ¥ ¥ E 4 0 5 10 ê ú F ¥ ¥ ¥ ê ú 10 18 0 ë û F C 7 Dijkstra算法—例子 例:计算从A点出发的单源最短路径 图 单源最短路径运算过程表 邻接矩阵
A B C D E F ¥ ¥ ¥ 8 A é ù 0 5 30 E B ê ú ¥ ¥ ¥ 2 0 8 B 2 4 ê ú 15 ê ú ¥ ¥ ¥ C 15 0 7 ê ú D A 18 D ¥ ¥ ¥ ¥ ¥ 0 30 ê ú ê ú ¥ ¥ ¥ ¥ E 4 0 5 10 ê ú F ¥ ¥ ¥ ê ú 10 18 0 ë û F C 7 Dijkstra算法—例子 例:计算从A点出发的单源最短路径 图 单源最短路径运算过程表 邻接矩阵
A B C D E F ¥ ¥ ¥ 8 A é ù 0 5 30 E B ê ú ¥ ¥ ¥ 2 0 8 B 2 4 ê ú 15 ê ú ¥ ¥ ¥ C 15 0 7 ê ú D A 18 D ¥ ¥ ¥ ¥ ¥ 0 30 ê ú ê ú ¥ ¥ ¥ ¥ E 4 0 5 10 ê ú F ¥ ¥ ¥ ê ú 10 18 0 ë û F C 7 Dijkstra算法—例子 例:计算从A点出发的单源最短路径 图 单源最短路径运算过程表 邻接矩阵
A B C D E F ¥ ¥ ¥ 8 A é ù 0 5 30 E B ê ú ¥ ¥ ¥ 2 0 8 B 2 4 ê ú 15 ê ú ¥ ¥ ¥ C 15 0 7 ê ú D A 18 D ¥ ¥ ¥ ¥ ¥ 0 30 ê ú ê ú ¥ ¥ ¥ ¥ E 4 0 5 10 ê ú F ¥ ¥ ¥ ê ú 10 18 0 ë û F C 7 Dijkstra算法—例子 例:计算从A点出发的单源最短路径 图 单源最短路径运算过程表 邻接矩阵
A B C D E F ¥ ¥ ¥ 8 A é ù 0 5 30 E B ê ú ¥ ¥ ¥ 2 0 8 B 2 4 ê ú 15 ê ú ¥ ¥ ¥ C 15 0 7 ê ú D A 18 D ¥ ¥ ¥ ¥ ¥ 0 30 ê ú ê ú ¥ ¥ ¥ ¥ E 4 0 5 10 ê ú F ¥ ¥ ¥ ê ú 10 18 0 ë û F C 7 Dijkstra算法—例子 例:计算从A点出发的单源最短路径 图 单源最短路径运算过程表 邻接矩阵
8 E B 15 D A 5 A B C D E F 10 ¥ ¥ ¥ A é ù 0 5 30 F C 7 ê ú ¥ ¥ ¥ 2 0 8 B ê ú ê ú ¥ ¥ ¥ C 15 0 7 ê ú D ¥ ¥ ¥ ¥ ¥ 0 ê ú ê ú ¥ ¥ ¥ ¥ E 4 0 ê ú F ¥ ¥ ¥ ê ú 10 18 0 ë û Dijkstra算法—例子 例:计算从A点出发的单源最短路径 图 单源最短路径运算结果 • 通过Distance数组得到最短路径长度: D: 22 • 通过对Path数组的反向搜索得到最短路径,如D结点相对于源点A的最短路径: DFCA 邻接矩阵
0 i =s Distance[i]= Wsi i≠s且<vs,vi>∈E, wsi为弧上的权值 ∞ i≠s且<vs,vi>不属于E Dijkstra算法—步骤 ①令S={Vs} ,用带权的邻接矩阵表示有向图,对图中每个顶点Vi按以下原则置初值: ②选择一个顶点Vj ,使得: Distance[j]=Min{ Distance[k]| Vk∈V-S } Vj就是求得的下一条最短路径终点,将Vj 并入到S中,即S=S∪{Vj} 。 ③ 对V-S中的每个顶点Vk ,修改dist[k],方法是: 若Distance[j]+Wjk<Distance[k],则修改为: Distance[k]=Distance[j]+Wjk (Vk∈V-S ) ④重复②,③,直到S=V为止。
Dijkstra算法—实现 • 参数: 输入:带权图G;源点序号v0; 输出:distance[]用来存放得到的从源点v0到其余各 顶点的最短距离数值; path[]用来存放得到的从源点v0到其余各顶点 的最短路径上到达目标顶点的前一顶点下标。 • Dijkstra函数设计: • void Dijkstra(AdjMWGraph &G, int v0, int distance[], int path[]) • //带权图G从下标v0顶点到其他顶点的最短距离distance • //和相应的目标顶点的前一顶点下标path • { • … … // 见教材P275页 • }
Dijkstra算法—算法分析 • Dijkstra算法的主要执行是: • ◆ 数组变量的初始化:时间复杂度是O(n) ; • ◆ 求最短路径的二重循环:时间复杂度是O(n2) ; • 因此,整个算法的时间复杂度是O(n2) 。
A B C D E F ¥ ¥ ¥ 8 A é ù 0 5 30 E B ê ú ¥ ¥ ¥ 2 0 8 B 2 4 ê ú 15 ê ú ¥ ¥ ¥ C 15 0 7 ê ú D A 18 D ¥ ¥ ¥ ¥ ¥ 0 30 ê ú ê ú ¥ ¥ ¥ ¥ E 4 0 5 10 ê ú F ¥ ¥ ¥ ê ú 10 18 0 ë û F C 7 课堂练习 • 计算 从C点出发的单源最短路径,完成下列单源最短路径计算表格。 图 单源最短路径运算过程表 邻接矩阵