版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、最短路径问题的求解最短路径问题的求解 最短路径是图论中的一个重要问题,具有很高的实用价值,也是信息最短路径是图论中的一个重要问题,具有很高的实用价值,也是信息学竞赛中常见的一类中等难度的题目,这类问题很能联系实际,考察学生学竞赛中常见的一类中等难度的题目,这类问题很能联系实际,考察学生的建模能力,反映出学生的创造性思维,因为有些看似跟最短路径毫无关的建模能力,反映出学生的创造性思维,因为有些看似跟最短路径毫无关系的问题,也可以归结为最短路径问题来求解。系的问题,也可以归结为最短路径问题来求解。 在带权图在带权图G=G=(V V,E E)中,若顶点)中,若顶点 Vi,VjVi,Vj是图是图G G
2、的两个顶点,从顶点的两个顶点,从顶点ViVi到到VjVj的路径长度定义为路径上各条边的权值之和。从顶点的路径长度定义为路径上各条边的权值之和。从顶点ViVi到到VjVj可能有多可能有多条路径,其中路径长度最小的一条路径称为顶点条路径,其中路径长度最小的一条路径称为顶点ViVi到到VjVj的最短路径。的最短路径。 一般有两类最短路径问题:一类是求从某个顶点(源点)到其它顶一般有两类最短路径问题:一类是求从某个顶点(源点)到其它顶点(终点)的最短路径;另一类是求图中每一对顶点间的最短路径。点(终点)的最短路径;另一类是求图中每一对顶点间的最短路径。 对于不带权的图,只要人为的把每条边加上权值对于不
3、带权的图,只要人为的把每条边加上权值1 1,即可当作带权图,即可当作带权图一样处理了。一样处理了。 最短路径问题的求解最短路径问题的求解 例例1 1、假设、假设A A、B B、C C、D D、E E各个城市之间旅费如下图红各个城市之间旅费如下图红色数字所示。某人想从城市色数字所示。某人想从城市A A出发出发游览各城市一遍游览各城市一遍,而所用而所用旅费最少旅费最少,试编程输出结果。,试编程输出结果。 问题分析问题分析 解这类问题时,很多同学往往不得要领,采用穷解这类问题时,很多同学往往不得要领,采用穷举法把所有可能的情况全部列出,再找出其中旅费最举法把所有可能的情况全部列出,再找出其中旅费最少
4、的那条路径;或者采用递归(深搜)找出所有路径,少的那条路径;或者采用递归(深搜)找出所有路径,再找出旅费最少的那条。但这两种方法都是费时非常再找出旅费最少的那条。但这两种方法都是费时非常多的解法,如果城市数目多的话则很可能要超时了。多的解法,如果城市数目多的话则很可能要超时了。实际上我们知道,递归(深搜)之类的算法一般实际上我们知道,递归(深搜)之类的算法一般用于求所有解问题(例如求从用于求所有解问题(例如求从A A出发每个城市都要走出发每个城市都要走一遍一共有哪几种走法?),所以这些算法对于求最一遍一共有哪几种走法?),所以这些算法对于求最短路径这类最优解问题显然是不合适的。短路径这类最优解
5、问题显然是不合适的。 首先,对于这类图,我们都应该先建立一个邻接矩阵,存放首先,对于这类图,我们都应该先建立一个邻接矩阵,存放任意两点间的数据(如距离、费用、时间等),以便在程序中方任意两点间的数据(如距离、费用、时间等),以便在程序中方便调用,以下介绍几种常见的、更好的求最短路径问题的算法。便调用,以下介绍几种常见的、更好的求最短路径问题的算法。 最短路径问题的求解最短路径问题的求解 一、一、 宽度优先搜索宽度优先搜索宽搜也并不是解决这类问题的优秀算法,这里只是简单介绍一下算法思路,为宽搜也并不是解决这类问题的优秀算法,这里只是简单介绍一下算法思路,为后面的优秀算法做个铺垫。具体如下:后面的
6、优秀算法做个铺垫。具体如下:1 1、 从从A A点开始依次展开得到点开始依次展开得到ABAB、ACAC、ADAD、AEAE四个新结点(第二层结点),当然四个新结点(第二层结点),当然每个新结点要记录下其旅费;每个新结点要记录下其旅费;2 2、 再次由再次由ABAB展开得到展开得到ABCABC、ABDABD、ABEABE三个新结点(第三层结点),而由三个新结点(第三层结点),而由ACAC结点结点可展开得到可展开得到ACBACB、ACDACD、ACEACE三个新结点,自然由三个新结点,自然由ADAD可以展开得到可以展开得到ADBADB、ADCADC、ADEADE,由,由AEAE可以展开得到可以展开
7、得到AEBAEB、AECAEC、AEDAED等新结点,对于每个结点也须记录下其旅费;等新结点,对于每个结点也须记录下其旅费;3 3、 再把第三层结点全部展开,得到所有的第四层结点:再把第三层结点全部展开,得到所有的第四层结点:ABCDABCD、ABCEABCE、ABDCABDC、ABDEABDE、ABECABEC、ABEDABED、AEDBAEDB、AEDCAEDC,每个结点也需记录下其旅费;,每个结点也需记录下其旅费;4 4、 再把第四层结点全部展开,得到所有的第五层结点:再把第四层结点全部展开,得到所有的第五层结点:ABCDEABCDE、ABCEDABCED、AEDBCAEDBC、AEDC
8、BAEDCB,每个结点也需记录下其旅费;,每个结点也需记录下其旅费;5 5、 到此,所有可能的结点均已展开,而第五层结点中旅费最少的那个就是题到此,所有可能的结点均已展开,而第五层结点中旅费最少的那个就是题目的解了。目的解了。由上可见,这种算法也是把所有的可能路径都列出来,再从中找出旅费最少的由上可见,这种算法也是把所有的可能路径都列出来,再从中找出旅费最少的那条,显而易见也是一种很费时的算法。那条,显而易见也是一种很费时的算法。 最短路径问题的求解最短路径问题的求解 二、二、 启发式搜索启发式搜索在宽度优先搜索算法的基础上,每次并不是把所有可展开的结点展开,在宽度优先搜索算法的基础上,每次并
9、不是把所有可展开的结点展开,而是对所有没有展开的结点,利用一个自己确定的估价函数对所有没展开而是对所有没有展开的结点,利用一个自己确定的估价函数对所有没展开的结点进行估价,从而找出最应该被展开的结点(也就是说我们要找的答的结点进行估价,从而找出最应该被展开的结点(也就是说我们要找的答案最有可能是从该结点展开),而把该结点展开,直到找到目标结点为止。案最有可能是从该结点展开),而把该结点展开,直到找到目标结点为止。这种算法最关键的问题就是如何确定估价函数,估价函数越准,则能这种算法最关键的问题就是如何确定估价函数,估价函数越准,则能越快找到答案。这种算法实现起来并不难,只不过难在找准估价函数,大
10、越快找到答案。这种算法实现起来并不难,只不过难在找准估价函数,大家可以自已找相关资料学习和思考。家可以自已找相关资料学习和思考。 最短路径问题的求解最短路径问题的求解 三、等代价搜索法三、等代价搜索法等代价搜索法也是在宽度优先搜索的基础上进行了部分优化的一种算法,它与等代价搜索法也是在宽度优先搜索的基础上进行了部分优化的一种算法,它与启发式搜索的相似之处都是每次只展开某一个结点(不是展开所有结点),不同之启发式搜索的相似之处都是每次只展开某一个结点(不是展开所有结点),不同之处在于:它不需要去另找专门的估价函数,而是以该结点到处在于:它不需要去另找专门的估价函数,而是以该结点到A A点的距离作
11、为估价值,点的距离作为估价值,也就是说,等代价搜索法是启发式搜索的一种简化版本。它的大体思路是:也就是说,等代价搜索法是启发式搜索的一种简化版本。它的大体思路是:1 1、 从从A A点开始依次展开得到点开始依次展开得到ABAB(7 7)、)、ACAC(3 3)、)、ADAD(1010)、)、AEAE(1515)四个新)四个新结点,把第一层结点结点,把第一层结点A A标记为已展开,并且每个新结点要记录下其旅费(括号中的标记为已展开,并且每个新结点要记录下其旅费(括号中的数字);数字);2 2、 把未展开过的把未展开过的ABAB、ACAC、ADAD、AEAE四个结点中距离最小的一个展开,即展开四个
12、结点中距离最小的一个展开,即展开ACAC(3 3)结点,得到)结点,得到ACBACB(8 8)、)、ACDACD(1616)、)、ACEACE(1313)三个结点,并把结点)三个结点,并把结点ACAC标记为标记为已展开;已展开;3 3、 再从未展开的所有结点中找出距离最小的一个展开,即展开再从未展开的所有结点中找出距离最小的一个展开,即展开ABAB(7 7)结点,)结点,得到得到ABCABC(1212)、)、ABDABD(2020)、)、ABEABE(1919)三个结点,并把结点)三个结点,并把结点ABAB标记为已展开;标记为已展开;4 4、 再次从未展开的所有结点中找出距离最小的一个展开,即
13、展开再次从未展开的所有结点中找出距离最小的一个展开,即展开ACBACB(8 8)结)结点,点,;5 5、 每次展开所有未展开的结点中距离最小的那个结点,直到展开的新结点中每次展开所有未展开的结点中距离最小的那个结点,直到展开的新结点中出现目标情况(结点含有出现目标情况(结点含有5 5个字母)时,即得到了结果。个字母)时,即得到了结果。 最短路径问题的求解最短路径问题的求解 小结:小结: 由上可见,启发式搜索和等代价搜索法并没有象宽度优先搜索由上可见,启发式搜索和等代价搜索法并没有象宽度优先搜索一样展开所有结点,只是根据某一原则(或某一估价函数值)每次一样展开所有结点,只是根据某一原则(或某一估
14、价函数值)每次展开距离展开距离A A点最近的那个结点(或是估价函数计算出的最可能的那点最近的那个结点(或是估价函数计算出的最可能的那个结点),反复下去即可最终得到答案。虽然中途有时也展开了一个结点),反复下去即可最终得到答案。虽然中途有时也展开了一些并不是答案的结点,但这种展开并不是大规模的,不是全部展开,些并不是答案的结点,但这种展开并不是大规模的,不是全部展开,因而耗时要比宽度优先搜索小得多。因而耗时要比宽度优先搜索小得多。最短路径问题的求解最短路径问题的求解 例例2 2、题目基本同例、题目基本同例1 1,现在把权定义成距离,现在,现在把权定义成距离,现在要求要求A A点到点到E E点的最
15、短路径,但并不要求每个城市都点的最短路径,但并不要求每个城市都要走一遍。要走一遍。 例例1 1、假设、假设A A、B B、C C、D D、E E各个城市之间旅费如下图红各个城市之间旅费如下图红色数字所示。某人想从城市色数字所示。某人想从城市A A出发游览各城市一遍,出发游览各城市一遍,而所用旅费最少,试编程输出结果。而所用旅费最少,试编程输出结果。 问题分析问题分析 既然不要求每个点都要走一遍,只要距离最短即可,那么普通的宽度优先搜索已经没有什么意义了,既然不要求每个点都要走一遍,只要距离最短即可,那么普通的宽度优先搜索已经没有什么意义了,实际上就是穷举。那么等代价搜索能不能再用在这题上呢?答
16、案是肯定的,但到底搜索到什么时候才能得实际上就是穷举。那么等代价搜索能不能再用在这题上呢?答案是肯定的,但到底搜索到什么时候才能得到答案呢?这可是个很荆手的问题。到答案呢?这可是个很荆手的问题。是不是搜索到一个结点是以是不是搜索到一个结点是以E E结束时就停止呢?显然不对。结束时就停止呢?显然不对。那么是不是要把所有以那么是不是要把所有以E E为结束的结点全部搜索出来呢?这简直就是宽度优先搜索了,显然不对。为结束的结点全部搜索出来呢?这简直就是宽度优先搜索了,显然不对。实际上,实际上,应该是搜索到:当我们确定将要展开的某个结点(即所有未展开的结点中距离最小的那个点)应该是搜索到:当我们确定将要
17、展开的某个结点(即所有未展开的结点中距离最小的那个点)的最后一个字母是的最后一个字母是E E时,这个结点就是我们所要求的答案!因为比这个结点大的点再展开得到的解显然不时,这个结点就是我们所要求的答案!因为比这个结点大的点再展开得到的解显然不可能比这个结点优!可能比这个结点优! 那么,除了等代价搜索外,有没有其它办法了呢?下面就介绍这种求最短路径问题的其它几种成熟算那么,除了等代价搜索外,有没有其它办法了呢?下面就介绍这种求最短路径问题的其它几种成熟算法。法。 最短路径问题的求解最短路径问题的求解 四、宽度优先搜索四、宽度优先搜索+ +剪枝剪枝 搜索之所以低效,是因为在搜索过程中存在着大量的重复
18、和不必要的搜索。因此,提高搜索效率的关搜索之所以低效,是因为在搜索过程中存在着大量的重复和不必要的搜索。因此,提高搜索效率的关键在于减少无意义的搜索。键在于减少无意义的搜索。假如在搜索时已经搜出从起点假如在搜索时已经搜出从起点A A到点到点B B的某一条路径的长度是的某一条路径的长度是X X,那么我们就可以,那么我们就可以知道,从知道,从A A到到B B的最短路径长度必定的最短路径长度必定XX,因此,其他从,因此,其他从A A到到B B的长度大于或等于的长度大于或等于X X的路径可以一律剔除。的路径可以一律剔除。具体具体实现时,可以开一个数组实现时,可以开一个数组h1.nh1.n,n n是结点
19、总数,是结点总数,hihi表示从起点到结点表示从起点到结点i i的最短路径长度。的最短路径长度。 算法流程如下:算法流程如下:1 1、初始化:初始化: 将起点将起点startstart入队,入队,hstart:=0hstart:=0,hk:=maxlongint(1=k=nhk:=maxlongint(1=k=n,且,且kstart)kstart)。2 2、repeatrepeat 取出队头结点赋给取出队头结点赋给t t; while twhile t有相邻的结点没被扩展有相邻的结点没被扩展 beginbegin t t扩展出新的结点扩展出新的结点newpnewp; 如果如果 ht+wt,ne
20、wp hnewpht+wt,newp hnewp, 则将则将newpnewp入队,把入队,把hnewphnewp的值更新为的值更新为ht+wt,newpht+wt,newp; EndEnd until until 队列空;队列空; 最短路径问题的求解最短路径问题的求解 五、迭代法五、迭代法 该算法的中心思想是:任意两点该算法的中心思想是:任意两点i,ji,j间的最短距离(记为间的最短距离(记为DijDij)会等于从)会等于从i i点出发到达点出发到达j j点的以任一点为点的以任一点为中转点的所有可能的方案中,距离最短的一个。即:中转点的所有可能的方案中,距离最短的一个。即:Dij = min
21、Dij , Dik+Dkj Dij = min Dij , Dik+Dkj ,1=k=n1=k=n。这样,我们就找到了一个类似动态规划的表达式,只不过这里我们不把它当作动态规划去处理,而是这样,我们就找到了一个类似动态规划的表达式,只不过这里我们不把它当作动态规划去处理,而是做一个二维数组用以存放任意两点间的最短距离,利用上述公式不断地对数组中的数据进行处理,直到各做一个二维数组用以存放任意两点间的最短距离,利用上述公式不断地对数组中的数据进行处理,直到各数据不再变化为止,这时即可得到数据不再变化为止,这时即可得到A A到到E E的最短路径。的最短路径。算法流程如下:算法流程如下: DiDi表
22、示从起点到表示从起点到i i的最短路的长度,的最短路的长度,g g是邻接矩阵,是邻接矩阵,s s表示起点;表示起点; 1 1、Di:=gs,i (1=i=n)Di:=gs,i (1=iDk+gk,j then if DjDk+gk,j then begin Dj:= Dk+gk,j; c:=true; end; begin Dj:= Dk+gk,j; c:=true; end; Until not c Until not c; 这种算法是产生这样一个过程:不断地求一个数字最短距离矩阵中的数据的值,而当所有这种算法是产生这样一个过程:不断地求一个数字最短距离矩阵中的数据的值,而当所有数据都已经不
23、能再变化时,就已经达到了目标的平衡状态,这时最短距离矩阵中的值就是对应数据都已经不能再变化时,就已经达到了目标的平衡状态,这时最短距离矩阵中的值就是对应的两点间的最短距离。的两点间的最短距离。 最短路径问题的求解最短路径问题的求解 六、动态规划六、动态规划 动态规划算法已经成为了许多难题的首选算法。某些最短路径问题也可以用动态规划来解决,通动态规划算法已经成为了许多难题的首选算法。某些最短路径问题也可以用动态规划来解决,通常这类最短路径问题所对应的图必须是有向无回路图。因为如果存在回路,动态规划的无后效性就无常这类最短路径问题所对应的图必须是有向无回路图。因为如果存在回路,动态规划的无后效性就
24、无法满足。法满足。我们知道,动态规划算法与递归算法的不同之处在于它们的算法表达式:我们知道,动态规划算法与递归算法的不同之处在于它们的算法表达式: 递归:类似递归:类似f(n)=x1f(n)=x1* *f(n-1)+x2f(n-1)+x2* *f(n-2)f(n-2),即可以找到一个确定的关系的表达式;,即可以找到一个确定的关系的表达式;动态规划:类似动态规划:类似f(n)=min(f(n-1)+x1,f(n-2)+x2)f(n)=min(f(n-1)+x1,f(n-2)+x2),即我们无法找到确定关系的表达式,只能,即我们无法找到确定关系的表达式,只能找到这样一个不确定关系的表达式,找到这样
25、一个不确定关系的表达式,f(n)f(n)的值是动态的,随着的值是动态的,随着f(n-1),f(n-2)f(n-1),f(n-2)等值的改变而确定跟谁相等值的改变而确定跟谁相关。关。为了给问题划分阶段,必须对图进行一次拓扑排序,然后按照拓扑排序的结果来动态规划。为了给问题划分阶段,必须对图进行一次拓扑排序,然后按照拓扑排序的结果来动态规划。 譬如,有如下两个有向图:譬如,有如下两个有向图: 3BD C E A9852143BD C E A985214最短路径问题的求解最短路径问题的求解 右图因为存在回路而不能用动态规划。而左图是无回路的,所以可以用动态规划解决。右图因为存在回路而不能用动态规划。
26、而左图是无回路的,所以可以用动态规划解决。对左图拓扑排序,得到的序列是对左图拓扑排序,得到的序列是A A、B B、D D、C C、E E。设设F(E)F(E)表示从表示从A A到到E E的最短路径长度,然后按照拓扑序列的先后顺序进行动态规划:的最短路径长度,然后按照拓扑序列的先后顺序进行动态规划: F(A)=0F(A)=0 F(B)=min F(A) +3=3 F(B)=min F(A) +3=3 F(D)=min F(A)+8, F(B)+2 =5 F(D)=min F(A)+8, F(B)+2 =5 F(C)=min F(B)+9, F(D)+5 =10 F(C)=min F(B)+9,
27、F(D)+5 =10 F(E)=min F(D)+1, F(C)+4 =6 F(E)=min F(D)+1, F(C)+4 =6总的式子是:总的式子是:F(i)=min F(k)+dis(i,k) F(i)=min F(k)+dis(i,k) ,k k与与i i必须相连,且在拓扑序列中,必须相连,且在拓扑序列中,k k在在i i之前。之前。3BD C E A9852143BD C E A985214最短路径问题的求解最短路径问题的求解 七、标号法七、标号法标号法是一种非常直观的求最短路径的算法,单从分析过程来看,我们可以用一个数轴简单地表标号法是一种非常直观的求最短路径的算法,单从分析过程来看
28、,我们可以用一个数轴简单地表示这种算法:示这种算法:1 1、 以以A A点为点为0 0点,展开与其相邻的点,并在数轴中标出。点,展开与其相邻的点,并在数轴中标出。 2 2、因为、因为C C点离起点点离起点A A最近,因此可以断定最近,因此可以断定C C点一定是由点一定是由A A直接到直接到C C点这条路径是最短的(因为点这条路径是最短的(因为A A、C C两点两点间没有其它的点,所以间没有其它的点,所以C C点可以确定是由点可以确定是由A A点直接到达为最短路径)。因而就可以以已经确定的点直接到达为最短路径)。因而就可以以已经确定的C C点点为当前展开点,展开与为当前展开点,展开与C C点想连
29、的所有点点想连的所有点AA、BB、DD、EE。 3 3、由数轴可见,、由数轴可见,A A与与AA点相比,点相比,A A点离原点近,因而保留点离原点近,因而保留A A点,删除点,删除AA点,相应的,点,相应的,B B、BB点保留点保留B B点,点,D D、DD保留保留DD,E E、EE保留保留EE,得到下图:,得到下图: 最短路径问题的求解最短路径问题的求解 4 4、此时再以离原点最近的未展开的点、此时再以离原点最近的未展开的点B B联接的所有点,处理后,再展开离原点最近未展开的联接的所有点,处理后,再展开离原点最近未展开的D D点,点,处理后得到如下图的最终结果:处理后得到如下图的最终结果:
30、5 5、由上图可以得出结论:点、由上图可以得出结论:点C C、B B、D D、E E就是点就是点A A到它们的最短路径(注意:这些路径并不是经过了到它们的最短路径(注意:这些路径并不是经过了所有点,而是只经过了其中的若干个点,而且到每一个点的那条路径不一定相同)。因而所有点,而是只经过了其中的若干个点,而且到每一个点的那条路径不一定相同)。因而A A到到E E的最的最短距离就是短距离就是1313。至于它经过了哪几个点大家可在上述过程中加以记录即可。至于它经过了哪几个点大家可在上述过程中加以记录即可。 最短路径问题的求解最短路径问题的求解 八、八、DijkstraDijkstra算法(从一个顶点
31、到其余各顶点的最短路径,单源最短路径)算法(从一个顶点到其余各顶点的最短路径,单源最短路径) 例例3 3、如下图,假设、如下图,假设C C1 1,C,C2 2,C,C3 3,C,C4 4,C,C5 5,C,C6 6是六座城市,他们之间的连线表示两是六座城市,他们之间的连线表示两城市间有道路相通,连线旁的数字表示路程。请编写一程序,找出城市间有道路相通,连线旁的数字表示路程。请编写一程序,找出C C1 1到到C Ci i的最短路径的最短路径(2i6)(2i6),输出路径序列及最短路径的路程长度。,输出路径序列及最短路径的路程长度。 最短路径问题的求解最短路径问题的求解 问题分析问题分析 对于一个
32、含有对于一个含有n n个顶点和个顶点和e e条边的图来说,从某一个顶点条边的图来说,从某一个顶点ViVi到其余任一顶点到其余任一顶点VjVj的最短路径,可的最短路径,可能是它们之间的边(能是它们之间的边(ViVi,VjVj),也可能是经过),也可能是经过k k个中间顶点和个中间顶点和k+1k+1条边所形成的路径条边所形成的路径(1kn-2)(1kn-2)。下面给出解决这个问题的下面给出解决这个问题的DijkstraDijkstra算法思想。算法思想。 设图设图G G用邻接矩阵的方式存储在用邻接矩阵的方式存储在GAGA中,中,GAi,j=maxintGAi,j=maxint表示表示ViVi,Vj
33、Vj是不关联的,否则为权值是不关联的,否则为权值(大于(大于0 0的实数)。设集合的实数)。设集合S S用来保存已求得最短路径的终点序号,初始时用来保存已求得最短路径的终点序号,初始时S=ViS=Vi表示只有源点,表示只有源点,以后每求出一个终点以后每求出一个终点VjVj,就把它加入到集合中并作为新考虑的中间顶点。设数组,就把它加入到集合中并作为新考虑的中间顶点。设数组dist1.ndist1.n用来用来存储当前求得的最短路径,初始时存储当前求得的最短路径,初始时ViVi,VjVj如果是关联的,则如果是关联的,则distjdistj等于权值,否则等于等于权值,否则等于maxintmaxint,
34、以后随着新考虑的中间顶点越来越多,以后随着新考虑的中间顶点越来越多,distjdistj可能越来越小。再设一个与可能越来越小。再设一个与distdist对应的数组对应的数组path1.npath1.n用来存放当前最短路径的边,初始时为用来存放当前最短路径的边,初始时为ViVi到到VjVj的边,如果不存在边则为空。的边,如果不存在边则为空。 执行时,先从执行时,先从S S以外的顶点(即待求出最短路径的终点)所对应的以外的顶点(即待求出最短路径的终点)所对应的distdist数组元素中,找出其数组元素中,找出其值最小的元素(假设为值最小的元素(假设为distmdistm),该元素值就是从源点),该
35、元素值就是从源点ViVi到终点到终点VmVm的最短路径长度,对应的的最短路径长度,对应的pathmpathm中的顶点或边的序列即为最短路径。接着把中的顶点或边的序列即为最短路径。接着把VmVm并入集合并入集合S S中,然后以中,然后以VmVm作为新考虑的中作为新考虑的中间顶点,对间顶点,对S S以外的每个顶点以外的每个顶点VjVj,比较,比较distm+GAm,jdistm+GAm,j的的distjdistj的大小,若前者小,表明加入的大小,若前者小,表明加入了新的中间顶点后可以得到更好的方案,即可求得更短的路径,则用它代替了新的中间顶点后可以得到更好的方案,即可求得更短的路径,则用它代替di
36、stjdistj,同时把,同时把VjVj或边(或边(VmVm,VjVj)并入到)并入到pathjpathj中。重复以上过程中。重复以上过程n-2n-2次,即可在次,即可在distdist数组中得到从源点到其余数组中得到从源点到其余各终点的最段路径长度,对应的各终点的最段路径长度,对应的pathpath数组中保存着相应的最段路径。数组中保存着相应的最段路径。 对于上图,采用对于上图,采用DijkstraDijkstra算法找出算法找出C C1 1到到C Ci i之间的最短路径之间的最短路径(2i6)(2i6)的过程如下:的过程如下: 最短路径问题的求解最短路径问题的求解 123456Dist04
37、8maxintmaxintmaxintPathC1C1,C2C1,C3初始时:初始时: 第一次:选择第一次:选择m=2m=2,则,则S=CS=C1 1,C,C2 2 ,计算比较,计算比较dist2+GA2,jdist2+GA2,j与与distjdistj的大小的大小 123456Dist047810maxintPathC1C1,C2C1,C2,C3C1,C2,C4C1,C2,C5第二次:选择第二次:选择m=3m=3,则,则S=CS=C1 1,C,C2 2,C,C3 3 ,计算比较,计算比较dist3+GA3,jdist3+GA3,j与与distjdistj的大小的大小 123456Dist04
38、789maxintPathC1C1,C2C1,C2,C3C1,C2,C4C1,C2,C3,C5第三次:选择第三次:选择m=4m=4,S=CS=C1 1,C,C2 2,C,C3 3,C,C4 4 ,计算比较,计算比较dist4+GA4,jdist4+GA4,j与与distjdistj的大小的大小 123456Dist0478917PathC1C1,C2C1,C2,C3C1,C2,C4C1,C2,C3,C5C1,C2,C4,C6最短路径问题的求解最短路径问题的求解 第四次:选择第四次:选择m=5m=5,则,则S=CS=C1 1,C,C2 2,C,C3 3,C,C4 4,C,C5 5 ,计算比较,计
39、算比较dist5+GA5,jdist5+GA5,j与与distjdistj的大小的大小 123456Dist0478913PathC1C1,C2C1,C2,C3C1,C2,C4C1,C2,C3,C5C1,C2,C3,C5,C6因为该图的度因为该图的度n=6n=6,所以执行,所以执行n-2=4n-2=4次后结束,此时通过次后结束,此时通过distdist和和pathpath数组可以看出:数组可以看出:C C1 1到到C C2 2的最短路径为:的最短路径为:C C1 1CC2 2,长度为:,长度为:4 4;C C1 1到到C C3 3的最短路径为:的最短路径为:C C1 1CC2 2CC3 3,长
40、度为:,长度为:7 7;C C1 1到到C C4 4的最短路径为:的最短路径为:C C1 1CC2 2CC4 4,长度为:,长度为:8 8;C C1 1到到C C5 5的最短路径为:的最短路径为:C C1 1CC2 2CC3 3CC5 5,长度为:,长度为:9 9;C C1 1到到C C6 6的最短路径为:的最短路径为:C C1 1CC2 2CC3 3CC5 5CC6 6,长度为:,长度为:1313;123456Dist0478917PathC1C1,C2C1,C2,C3C1,C2,C4C1,C2,C3,C5C1,C2,C4,C6最短路径问题的求解最短路径问题的求解 下面给出具体的下面给出具体
41、的DijkstraDijkstra算法框架(注:为了实现上的方便,我们用一个一维数组算法框架(注:为了实现上的方便,我们用一个一维数组s1.ns1.n代替集合代替集合S S,用来保存已求得最短路径的终点集合,即如果,用来保存已求得最短路径的终点集合,即如果sj=0sj=0表示顶点表示顶点VjVj不在集合中,反之,不在集合中,反之,sj=1sj=1表示顶点表示顶点VjVj已在集合中)。已在集合中)。 Procedure Dijkstra(GA,dist,path,i)Procedure Dijkstra(GA,dist,path,i); 表示求表示求ViVi到图到图G G中其余顶点的最短路径,中
42、其余顶点的最短路径,GAGA为图为图G G的邻接矩阵,的邻接矩阵,distdist和和pathpath为变量型参数,为变量型参数, 其中其中pathpath的基类型为集合的基类型为集合 Begin Begin For j:=1 To n Do Begin For j:=1 To n Do Begin 初始化初始化 If ji Then sj:=0 Else sj:=1 If ji Then sj:=0 Else sj:=1; distj:=GAi,jdistj:=GAi,j; If distjmaxint Then pathj:=i+j Else pathj:= If distjmaxint
43、Then pathj:=i+j Else pathj:= ; EndEnd;最短路径问题的求解最短路径问题的求解 For k:=1 To n-2 DoFor k:=1 To n-2 Do Begin Begin w:=maxint w:=maxint;m:=im:=i; For j:=1 To n Do For j:=1 To n Do 求出第求出第k k个终点个终点VmVm If (sj=0) and (distjw) Then Begin m:=j If (sj=0) and (distjw) Then Begin m:=j;w:=distjw:=distj; EndEnd; If mi
44、Then sm:=1 else exitIf mi Then sm:=1 else exit; 若条件成立,则把若条件成立,则把VmVm加入到加入到S S中,中, 否则退出循环,因为剩余的终点,其最短路径长度均为否则退出循环,因为剩余的终点,其最短路径长度均为maxintmaxint,无需再计算下去,无需再计算下去 For j:=1 To n Do For j:=1 To n Do 对对sj=0sj=0的更优元素作必要修改的更优元素作必要修改 If (sj=0) and (distm+GAm,jdistj) If (sj=0) and (distm+GAm,jdistj) Then Begin
45、 Distj:=distm+GAm,j Then Begin Distj:=distm+GAm,j;pathj:=pathm+jpathj:=pathm+j;EndEnd; EndEnd;EndEnd;最短路径问题的求解最短路径问题的求解 九、九、FloydFloyd算法算法例例4 4、求任意一对顶点之间的最短路径。、求任意一对顶点之间的最短路径。 问题分析问题分析 这个问题的解法有两种:一是分别以图中的每个顶点为源点共这个问题的解法有两种:一是分别以图中的每个顶点为源点共调用调用n n次次DijkstraDijkstra算法算法,这种算法的时间复杂度为,这种算法的时间复杂度为O O(n n3
46、 3);另外还有一种算法:);另外还有一种算法:FloydFloyd算法算法,它的思路,它的思路简单,但时间复杂度仍然为简单,但时间复杂度仍然为O O(n n3 3),下面介绍),下面介绍FloydFloyd算法。算法。 设具有设具有n n个顶点的一个带权图个顶点的一个带权图G G的邻接矩阵用的邻接矩阵用GAGA表示,再设一个与表示,再设一个与GAGA同类型的表同类型的表示每对顶点之间最短路径长度的二维数组示每对顶点之间最短路径长度的二维数组A A,A A的初值等于的初值等于GAGA。FloydFloyd算法需要在算法需要在A A上上进行进行n n次运算,每次以次运算,每次以V Vk k(1k
47、n1kn)作为新考虑的中间点,求出每对顶点之间的当前)作为新考虑的中间点,求出每对顶点之间的当前最短路径长度,最后依次运算后,最短路径长度,最后依次运算后,A A中的每个元素中的每个元素AiAi,jj就是图就是图G G中从顶点中从顶点V Vi i到顶点到顶点V Vj j的最短路径长度。再设一个二维数组的最短路径长度。再设一个二维数组P1.n,1.nP1.n,1.n,记录最短路径,其元素类型为,记录最短路径,其元素类型为集合类型集合类型set of 1.nset of 1.n。 FloydFloyd算法的具体描述如下:算法的具体描述如下: 最短路径问题的求解最短路径问题的求解 Procedure
48、 Floyd(GAProcedure Floyd(GA,A A,P)P); BeginBegin For i:=1 To n Do For i:=1 To n Do 最短路径长度数组和最短路径数组初始化最短路径长度数组和最短路径数组初始化 For j:=1 To n Do For j:=1 To n Do Begin Begin Ai,j:=GAi,j Ai,j:=GAi,j; If Ai,jmaxint Then pi,j:=i+jIf Ai,jmaxint Then pi,j:=i+jElse pi,j:= Else pi,j:= ; EndEnd; For k:=1 To n Do nF
49、or k:=1 To n Do n次运算次运算 For i:=1 To n Do For i:=1 To n Do For j:=1 To n Do For j:=1 To n Do Begin Begin If (i=k)or(j=k)or(i=j) Then Continue If (i=k)or(j=k)or(i=j) Then Continue; 无需计算,直接进入下一轮循环无需计算,直接进入下一轮循环 If Ai,k+Ak,jAi,j Then Begin If Ai,k+Ak,jAi,j Then Begin 找到更短路径、保存找到更短路径、保存 Ai,j Ai,j:= Ai,k+
50、Ak,j= Ai,k+Ak,j; Pi,jPi,j:= Pi,k+Pk,j= Pi,k+Pk,j; EndEnd; EndEnd; EndEnd;最短路径问题的求解最短路径问题的求解 总结与思考:总结与思考: 最短路径问题的求解还不止这几种算法,比如还有分枝定界等等,而最短路径问题的求解还不止这几种算法,比如还有分枝定界等等,而且大家也可以创造出各种各样的新算法来。不同的最短路径问题到底用哪且大家也可以创造出各种各样的新算法来。不同的最短路径问题到底用哪种算法,以及还需要对该种算法作什么改动,是非常重要的,这种能力往种算法,以及还需要对该种算法作什么改动,是非常重要的,这种能力往往是很多同学所
51、欠缺的,这需要大家在平常的训练中多做这类题目,还要往是很多同学所欠缺的,这需要大家在平常的训练中多做这类题目,还要多总结,以达到熟能生巧的境界。多总结,以达到熟能生巧的境界。 在学习完最短路径后,有没有人想到:能不能修改这些算法,实现求在学习完最短路径后,有没有人想到:能不能修改这些算法,实现求最长路径的问题呢?最长路径的问题呢? 这种发散性的思维是值得称赞的,对于不存在回路的有向图,这种算这种发散性的思维是值得称赞的,对于不存在回路的有向图,这种算法是可行的。但需要提醒的是:如果有向图出现了回路,按照最长路径的法是可行的。但需要提醒的是:如果有向图出现了回路,按照最长路径的思想和判断要求,则计算可能沿着回路无限制的循环下去。思想和判断要求,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年回迁房项目绿化及环保施工合同
- 2025年个人门面出租及品牌合作合同范本4篇
- 2025年度门窗行业安全生产与应急管理合同4篇
- 二零二五版美团骑手劳动合同续签及调整合同4篇
- 二零二五年度金属材料购销合同全新规范2篇
- 2025版电子商务平台交易履约保函标准合同4篇
- 2025年度民间借贷合同争议仲裁条款设计
- 2025年度高端酒店管理服务合同规范文本3篇
- 2025年宠物猫寄养与宠物玩具租赁服务合同4篇
- 二零二五版窗帘安装与室内光照健康保护合同3篇
- 物业民法典知识培训课件
- 2023年初中毕业生信息技术中考知识点详解
- 2024-2025学年山东省德州市高中五校高二上学期期中考试地理试题(解析版)
- 《万方数据资源介绍》课件
- 麻风病病情分析
- 《急诊科建设与设备配置标准》
- 第一章-地震工程学概论
- JJF(陕) 063-2021 漆膜冲击器校准规范
- 《中国糖尿病防治指南(2024版)》更新要点解读
- TSGD7002-2023-压力管道元件型式试验规则
- 2024年度家庭医生签约服务培训课件
评论
0/150
提交评论