1 / 22

数据结构 第八章 图 8.6 单源最短路径

数据结构 第八章 图 8.6 单源最短路径. 生活中常见的“ 最短路径 ”问题. 单源最短路径问题. 单源最短路径 : 给定有向图 G 和源点 v ,求 v 到 G 中其余各 顶点的最短路径。. 相关概念. 算法思想. 数据结构及组织. Dijkstra 算法设计与实现. 算法分析. 课堂练习. A. B. C. D. E. F. ¥. ¥. ¥. 8. A. é. ù. 0. 5. 30. E. B. ê. ú. ¥. ¥. ¥. 2. 0. 8. B.

Download Presentation

数据结构 第八章 图 8.6 单源最短路径

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 数据结构 第八章 图8.6 单源最短路径

  2. 生活中常见的“最短路径”问题

  3. 单源最短路径问题 单源最短路径:给定有向图G和源点v,求v到G中其余各 顶点的最短路径。 相关概念 算法思想 数据结构及组织 Dijkstra算法设计与实现 算法分析 课堂练习

  4. 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)邻接矩阵

  5. 单源最短路径--算法思想 距离源点 最近的一个结点是? 源 有n个结点的网络

  6. 单源最短路径--算法思想 距离源点 最近的一个结点是? 第二近的是? 源 有n个结点的网络

  7. 单源最短路径--算法思想 距离源点 最近的一个结点是? 第二近的是? 第三近的会出现在那些路径上? 源 有n个结点的网络

  8. 单源最短路径--算法思想 距离源点 最近的一个结点是? 第二近的是? 第三近的会出现在那些路径上? 路径冲突怎么办? 源 有n个结点的网络

  9. 单源最短路径--算法思想 接下去,距离源点 第4、第5….第n近的结点? Dijkstra求解单源最短路径思想: 按从某顶点到其它顶点的路径长度递增的方式,逐渐求到各顶点的最短路径。 源 有n个结点的网络

  10. 单源最短路径--算法思想 设给定源点为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 } 利用上述公式就可以依次找出下一条最短路径。 源

  11. Dijkstra单源最短路径算法--数据组织 • 数据源 • 已确定结点集 S • 待选结点集 V-S • 结点临时最短路径长度 • 结点临时最短路径 源 有n个结点的网络

  12. 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数组 图 邻接矩阵 单源最短路径运算过程表

  13. 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点出发的单源最短路径 图 单源最短路径运算过程表 邻接矩阵

  14. 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点出发的单源最短路径 图 单源最短路径运算过程表 邻接矩阵

  15. 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点出发的单源最短路径 图 单源最短路径运算过程表 邻接矩阵

  16. 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点出发的单源最短路径 图 单源最短路径运算过程表 邻接矩阵

  17. 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点出发的单源最短路径 图 单源最短路径运算过程表 邻接矩阵

  18. 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的最短路径: DFCA 邻接矩阵

  19. 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为止。

  20. Dijkstra算法—实现 • 参数: 输入:带权图G;源点序号v0; 输出:distance[]用来存放得到的从源点v0到其余各 顶点的最短距离数值; path[]用来存放得到的从源点v0到其余各顶点 的最短路径上到达目标顶点的前一顶点下标。 • Dijkstra函数设计: • void Dijkstra(AdjMWGraph &G, int v0, int distance[], int path[]) • //带权图G从下标v0顶点到其他顶点的最短距离distance • //和相应的目标顶点的前一顶点下标path • { • … … // 见教材P275页 • }

  21. Dijkstra算法—算法分析 • Dijkstra算法的主要执行是: • ◆ 数组变量的初始化:时间复杂度是O(n) ; • ◆ 求最短路径的二重循环:时间复杂度是O(n2) ; • 因此,整个算法的时间复杂度是O(n2) 。

  22. 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点出发的单源最短路径,完成下列单源最短路径计算表格。 图 单源最短路径运算过程表 邻接矩阵

More Related