c课设报告基于Dijkstra算法的最短路径问题求解精编版
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
c课设报告基于
D i j k s t r a算法的最短
路径问题求解
公司标准化编码 [QQX96QT-XQQB89Q8-NQQJ6Q8-MQM9N]
课程设计任务书
目录
1 需求分析
Dijkstra 算法是由荷兰计算机科学家艾兹格·迪科斯彻发现的。算法解决的是有向图中最短路径问题。
举例来说,如果图中的顶点表示城市,而边上的权重表示着城市间开车行经的距离。 Dijkstra 算法可以用来找到两个城市之间的最短路径。
Dijkstra 算法的输入包含了一个有权重的有向图G ,以及G 中的一个来源顶点
S 。 我们以V 表示G 中所有顶点的集合。图中的每一个边,都是两个顶点所形成的有序元素对。(u ,v )表示从顶点u 到v 有路径相连。 假设E 为所有边的集合,而边的权重则由权重函数w :E → [0, ∞]定义。 因此,w (u ,v )就是从顶点
u 到顶点v 的非负花费值(cost)。 边的花费可以想像成两个顶点之间的距离。任两点间路径的花费值,就是该路径上所有边的花费值总和。 已知有V 中有顶点s 及t ,Dijkstra 算法可以找到s 到t 的最低花费路径. 最短路径)。 这个算法也可以在一个图中,找到从一个顶点s 到任何其他顶点的最短路径。
1.如果将交通网络化成带权图,假如用顶点表示城市,边表示公路段,则由这些顶点和边组成的图可表示沟通个城市的公路图,边的权用以表示两个城市之间的距离或者表示走过这段公路所需要的时间或通过这段路的难易程度等。作为司机和乘汽车的人,自然会关心如下两个问题:
(1)从甲地到乙地是否有公路
(2)从甲地到乙地有几条公路,哪条公路最短或花费的代价最小 这就是我们要讨论的最短路径问题。
2.迪杰斯特拉提出的一个求最短路径的算法。其基本思想是:按路径长度递增的顺序,逐个产生各最短路径。
3.首先引进辅助向量dist[],它的每一个分量dist[i]表示已经找到的且从源点0v 到每一个终点i v 的当前最短路径长度。它的初态为:如果从0v 到i v 有弧,则dist[i]为弧的权值;否则dist[i]为∞。其中,长度为
dist[j]=min{dist[i]|i v ∈V}的路径是从0v 出发的长度最短的一条最短路径,此路径为(0v ,i v )。
2 算法基本原理
根据以上分析,可以得到如下描述的算法:
①假设用带权的邻接矩阵arce[i][j]来表示带权有向图,arce[i][j]表示弧上的权值。若不存在,则置arce[i][j]为∞(在计算机上可用允许的最大值代替)。S 为已找到的从0v 出发的最短路径的终点的集合,它的初始状态为空集。那么,从0v 出发到图上其余个顶点(终点)i v 可能达到的最短路径长度的初值为:
dist[i]=arce[Locate Vex(G,0v )][i]i v ∈S ②选择j v 得
dist[j]=min{dist[i]|i v ∈V-S}
j v 就是当前求得的一条从0v 出发的最短路径的终点。令S=S ∪{j}。
③修改从0v 出发到集合V-S 上任一顶点k v 可达的最短顶点长度。如果 dist[j]+arce[j][k] dist[k]=dist[j]+arce[j][k] ④重复操作②、③共n-1次。由此求得从0v 到图上其余各顶点的最短路径是依路径长度递增的序列。 用Dijkstra 算法求有向图G 的0v 顶点到其余顶点v 的最短路径P[v]及其带权长度D[v]。 这个算法是通过为每个顶点v 保留目前为止所找到的从s 到v 的最短路径来工作的。初始时,源点s 的路径长度值被赋为0(d[s]=0), 同时把所有其他顶点的路径长度设为无穷大,即表示我们不知道任何通向这些顶点的路径(对于 V 中所有顶点v 除s 外d[v]= ∞)。当算法结束时,d[v]中储存的便是从s 到v 的最短路径,或者是无穷大(如果路径不存在的话)。 Dijstra 算法的基础操作是边的拓展:如果存在一条从u 到v 的边,那么从s 到v 的最短路径可以通过将边(u ,v )添加到s 到u 的尾部来拓展。这条路径的长度是d[u]+w(u,v)。如果这个值比目前已知的d[v]的值要小,我们可以用新值来替代当前d[v]中的值。拓展边的操作一直执行到所有的d[v]都代表从s 到v 最短路径的花费。这个算法经过适当的组织因而当d[u]达到它最终的值的时候,每条边(u ,v )都只被拓展一次。 算法维护两个顶点集S 和Q 。集合S 保留了我们已知的所有d[v]的值已经是最短路径的值顶点,而集合Q 则保留其他所有顶点。集合S 初始状态为空,而后每一步都有一个顶点从Q 移动到S 。这个被选择的顶点是Q 中拥有最小的d[u]值的顶点。当一个顶点u 从Q 中转移到了S 中,算法对每条外接边(u,v)进行拓展。 Dijkstra(G ,D ,s){ ()10W v =1v 1v ()j T v ()j T v ()1W v ()(){} min ,j i ij T v W v w +()j T v ()j T v ()k T v k v 1 v j v ()0W u ≥j v k v 1v k v ()k T v ()k T v 1v k v ()()k k W v T v =k v ()()k n W v W v =1v n v i k v v =1v k v k n v v =ij D d ⎡⎤=⎣⎦0ij d >i j i j ij d i j i j k k 1,2,3, ,k n =ij d ik kj d d +ik d kj d i k k j ik kj d d +i j k ij ik kj d d d >+i k j i j i j ij d ik kj d d +k ij d i j k ij d i j 0 - 1 -1 C 常用算 法程序集. 北京:清华大学出版社,1995 [2]郑莉,董渊,张瑞丰. C++语言程序设计(第3版). 北京:清华大学出版社,2007