课程设计 单源点最短路径算法的实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计
设计说明书
单源点最短路径算法的实现
学生姓名
学号
班级
成绩
指导教师
数学与计算机科学学院
2015年 1 月 2 日
数据结构课程设计评阅书
课程设计任务书
2014—2015学年第1学期
专业:学号:姓名:
课程设计名称:数据结构课程设计
设计题目:单源点最短路径算法的实现
完成期限:自 2014 年 12 月 22 日至 2015 年 1 月 2 日共 2 周
设计内容及要求:
最短路径问题已经被应用到GIS、GPS等信息管理系统中,为人们生活带来了很大便利。它属于图结构问题,其解决方法也有不少(如Dijkstra、A-star)。单源点最短路径问题解决的是既定起点的情况下,寻求该点到图中其它顶点的最短路径。请用C/C++语言的结构体、指针、数据结构等基础知识,编写程序实现图的结构定义、图的存储,以及求解单源点最短路径。
设计过程以及写作要求如下:
(1)要针对本题目,认真研究所设计的内容,用简明扼要的语言描述课题,给出课题的基本内容及要求;
(2)根据数据结构的相关知识给出实现建立任意m个顶点n条边的图算法、按照用户给定的源点和目标点,求出它们间的最短路径(打印出来)算法的基本策略及思路;
(3)给出较为详尽数据结构与算法,算法可以用流程图、伪代码等描述手段进行描述;
(4)给出一个完整的算法实现的C/C++程序,算法中的各子算法要力求用函数来实现;
(5)对编写的程序要进行详尽的测试分析;
(6)对本课题的设计工作要进行一个完整深刻的总结。
最终设计成果形式为:
1、设计软件一套;
2、撰写一份课程设计说明书一份,打印并装订成册。
指导教师(签字):教研室主任(签字):
批准日期:年月日
摘要
本系统以VC++作为软件开发环境,C语言作为程序开发语言,邻接矩阵作为存储结构,设计与实现了最短路径运算。该系统实现了有向图的存储、最短路径的运算等主要功能。依照该系统可以解决生活中许多问题,比如交通路线的选择,工程时间的预算等等,让人们可以做出合理的选择。本系统通过分析课题的背景、意义、要求,分别从课题描述、逻辑设计、算法设计、调试与测试等各个方面详细介绍了系统的设计与实现过程,最后对系统的完成情况进行了总结。界面清晰,操作简单,易于用户接受。
关键词:VC++;邻接矩阵; 最短路径
目录
1课题描述 (1)
2 问题分析与任务定义 (2)
2.1问题分析 (2)
2.2任务定义 (2)
3 算法设计 (3)
3.1 图的邻接矩阵的存储结构 (3)
3.2 Dijkstra算法思想 (4)
4 系统逻辑设计 (5)
4.1 主函数流程图如图4.1所示 (5)
4.2 Create函数流程图如图4.2所示 (6)
4.3 Dijkstra函数流程图如图4.3所示 (8)
5 源代码 (11)
6 调试与测试 (14)
6.1合法数据输入 (14)
6.2非法数据输入 (15)
总结 (16)
参考文献 (17)
1课题描述
乘车旅行的人大多数都希望找出到目的地尽可能短,花费少的行程,那么如何找出从出发点到目的地的最短路径?由于路径比较多,所以用手工计算起来比较复杂,抽象,因此人们用计算机语言代替手工计算来求得最短路径。而在计算机语言中迪杰斯拉算法比较常用,简捷,故人们经常借助计算机程序用迪杰斯拉算法求得单源点的最短路径,这样可以广泛的提高效率,而且条理清晰,通俗易懂。
2 问题分析与任务定义
2.1问题分析
本系统是要解决的是单源点最短路径问题,设计程序,实现最短路径的求法,系统需要达到的主要功能如下:
(1) 编写算法能够建立带权图,并能够用Dijkstra算法求该图的最短路径。
(2) 能够选择图上的任意一顶点做为开始节点。最短路径输出不必采用图形方式,可顶点序列方式输出。
(3) 根据课设题目要求,拟将整体程序分为三大模块。两个子模块相互独立,没有嵌套调用的情况,在主模块中调用上面两个子模块。
2.2任务定义
根据课设题目要求,拟将整体程序分为三大模块。两个子模块相互独立,没有嵌套调用的情况,在主模块中调用上面两个子模块以下是三个模块的大体分析:
(1) 建立有向图的存储结构。
(2) 应用Dijkstra算法求出该有向图的最短路径。
(3) 在主函数中调用两个子函数,完成最短路径的程序设。
3算法设计
3.1图的邻接矩阵的存储结构
一个图的邻接矩阵表示唯一的。故在图的邻接矩阵表示中,除了需要用一个二维数组存储顶点之间相邻关系的邻接矩阵外,通常还需要使用一个具有n个元素的一维数组存储顶点信息,其中下标为i的元素存储顶点vi的信息。本设计是基于类C语言的算法描述,因此,图的邻接矩阵的存储结构定义如下:
#define MVNum 50
typedef struct {
VertexType vexs[MVNum];
Adjmatrix arcs[MVNum][MVNum];
}Mgraph;
在本系统中,以邻接矩阵存储有向图,如图3.1a中有向图G所示,其邻接矩阵为
3.2 Dijkstra算法思想
(1)Dijkstra算法核心是贪心,实质是按路径长度递增产生诸顶点的最短路径算法。用自然语言描述如下:
初始化S和D,置空最短路径终点集,置初始的最短路径值;
S[v1]=TRUE;D[v1]=0;
While(S集中的顶点数 { 开始循环,每次求的v1到某个v顶点的最短路径,并将v加到S集中; S[v]=TRUE; 更新当前最短路径及距离。 } (2)Dijkstra算法结束后,通过设置一个数组记录下一个节点的前趋节点,然后通过倒叙的方式输出该最短路径。