- 1、本文档共73页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法第四章资料
4.5 单源最短路径 ——问题分析 贪心策略:设置两个顶点集合 V-S 和 S,集合S中存放己经找到最短路径的顶点,集合 V-S 中存放当前还未找到最短路径的顶点。设置顶点集合S并不断地作贪心选择来扩充这个集合。一个顶点属于集合 S 当且仅当从源到该顶点的最短路径长度已知。 Chapter 4 4.5 单源最短路径 ——问题分析 例4-6 对图4-6的有向图,应用Dijkstra算法计算从源顶点0到其他顶点间最短路径,按其算法步骤执行过程如表4-7所示。 Chapter 4 0 1 4 2 3 10 100 30 10 50 20 60 图4-6 一个带权有向图 4.5 单源最短路径 ——问题分析 表4-7 Dijkstra算法的迭代过程 Chapter 4 迭代 S u distance [1] distance [2] distance [3] distance [4] 初始 {0} — 10 30 100 1 {0,1} 1 10 60 30 100 2 {0,1,3} 3 10 50 30 90 3 {0,1,3,2} 2 10 50 30 60 4 {0,1,3,2,4} 4 10 50 30 60 如何确定每个顶点最短路径所经过的顶点? 4.5 单源最短路径 ——问题分析 Chapter 4 如何确定每个顶点最短路径所经过的顶点? 解决方法: 使用数组Pre[ i ] 记录顶点 I 最短路径时的前驱顶点. 例如:有5个顶点的 Pre[5]={0,0,3,0,2},则源顶点0到第4个顶点的最短路径经过的顶点可以这样计算: 首先,pre[4]=2, pre[2]=3, pre[3]=0, 所以最短路径是从:0--?3-?2--?4 关键问题:如何确定pre[i]的值? 初始时,所有顶点的 pre[i]=0; 此后,当 i 顶点的最短路径发生修改时,即加入u到S中后, distance[i] = distance[u] + cost[u,j] distance[i] 时,修改i的最短路径值时同时修改pre[i]=u; 4.5 单源最短路径 ——算法分析 1)贪心选择性质 Dijkstra算法是应用贪心算法设计策略的又一个典型例子。它所作的贪心选择是从V-S中选择具有最短特殊路径的顶点u,从而确定从源到u的最短路径长度distance [u]。这种贪心选择为什么会导致最优解呢?换句话说,为什么从源到u没有更多的其他路径呢? 事实上,如果存在一条从源到u且长度比distance [u]更短的路,设这条路初次走出S之外到达的顶点为x∈V-S,然后徘徊于S内外若干次,最后离开S到达u,如下图所示。 Chapter 4 4.5 单源最短路径 ——算法分析 Chapter 4 源 S v U x 在这条路径上,分别记cost(v,x),cost(x,u)和cost(v,u)为顶点v到顶点x,顶点x到顶点v到顶点u的路长,那么distance [x]= cost (v,x) ,cost (v,x)+ cost (x,u)= cost (v,u) distance [u]。利用边权的非负性,可知cost (x,u)=0,从而推distance [x] distance [u],说明是具有最短路径的顶点,此为矛盾。这就证明了distance [u]是从源到顶点u的最短路径长度。 4.5 单源最短路径 ——算法分析 2)最优子结构性质 算法中确定的distance[u]确实是源点到顶点u的最短特殊路径长度。为此,只要考察算法在添加u到S中后,distance [u]的值所引起的变化。当添加u之后,可能出现一条到顶点i特殊的新路。 第一种情况:从u直接到达i如果cost [u][j] + distance [u] distance [i],则 cost [u][j] + distance [u]作为distance [i]新值。 Chapter 4 4.5 单源最短路径 ——算法分析 Chapter 4 第二种情况:从u不直接到达i,如下图所示。回到老S中某个顶点x,最后到达i。当前distance [i]的值小于从源点经u和x,最后到达i的路径长度。因此,算法中不考虑
文档评论(0)