c++课设报告《基于Dijkstra算法的最短路径问题求解》[1]

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计任务书

目录

1 需求分析............................................................................................ - 1 -

2 算法基本原理 ................................................................................... - 2 -

3 类设计................................................................................................ - 3 -

4 详细设计............................................................................................ - 5 -4.1类的接口设计 . (5)

4.2类的实现 (5)

4.3主函数设计 (7)

5 DOS界面程序运行结果及分析 ....................................................... - 8 -5.1程序运行结果 . (8)

5.2运行结果分析 (9)

6 基于MFC的图形界面程序开发..................................................... - 9 -6.1基于MFC的图形界面程序设计.. (10)

6.2程序测试 (13)

6.3MFC程序编写总结 (14)

7 参考文献.......................................................................................... - 15 -

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 的最低花费路径(i.e. 最短路径)。 这个算法也可以在一个图中,找到从一个顶点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]表示弧

j v >上的权值。若不存在,则置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[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 的最短路径,或者是无穷大(如果路径不存在的话)。