大数据结构课程设计最短路径.doc
《大数据结构课程设计最短路径.doc》由会员分享,可在线阅读,更多相关《大数据结构课程设计最短路径.doc(33页珍藏版)》请在课桌文档上搜索。
1、数据结构课程设计题目名称:最短路径 计算机科学与技术学院1、 需求分析(1)题目:最短路径实现图的输入,选择适宜的结构表示图,在此根底上实现求解最短路径的算法,可以从任意一点求最短路径,学生必须准备多组测试数据,并设计清晰易懂的输入输出界面,要求:如何用多种数据结构来求解问题。同时要某某现对应数据结构的所有根本操作。(2) 程序的输入与输出:要求用多种数据结构求解问题,也就是要用邻接表与邻接矩阵实现最短路径的算法,需要有多组输入输出,(a) 输入的形式和输入值的X围:输入的形式为整型1. 先输入共需要创建几次图2. 再分别输入边数和顶点数X围:11003. 输入1和2选择是否为有向图图1为有向
2、,2为无向4. 对应每条边输入起点和终点下标,以与对这条边的权值最大的权值为100。5. 输入在邻接表的根底上输入深度与广度优先搜索的起点6. 我们输入求各种最短路径起点和终点(b) 输出的形式;1. 输出所建立的邻接表表结点后面的括号是头结点与表结点的权值2. 输出DFS和BFS的结果3. 输出该图不带权值的最短路径与路径4. 接下来输入起点和终点,求带权值的最短路径也就是Dijstra算法,输出长度并给出路径5. 前面都是用邻接表实现的各种算法,接下来的Floyd算法就用矩阵实现,于是直接邻接表转矩阵输出6. 用Floyd算法求出图的多源最短路径,给出起点终点输出最短路径长度,接着便到了第
3、二次创建图,直至循环完毕。(3) 程序的功能:求给出带权图的任意两点,输出最短路径长度并给出其最短路径所经过的顶点。在实际应用中可以将交通网络化成带权的图,图中顶点表示城市,边代表城市之间的公路,边上的权值表示公路的长度。这样可以发现两个地方之间有无公路可连,在几条公路可通的情况下,可以找到那条路径最短。也就是现在地图app中的功能。4测试数据:包括正确的输入与其输出结果和含有错误的输入与其输出结果。 在有向图中输入错误的数据顶点与顶点方向相反,会输出逆向信息。2、 概要设计(a) 主程序首先多组输入一个n,在n不为0的前提下循环执行(b) 调用 BuildGraph()函数,创建一个图并以邻
4、接表的形式存储(c) BuildGraph()函数输入顶点、边数调用CreateGraph(Nv函数,初始化一个有Nv个顶点但没有边的图,再根据结构体Edge输入每个边的信息,调用InsertEdge( Graph, E ,c );函数将每条边插入到仅仅初始化的图中,完成一个图的建立,并返回一个邻接表类型的结构体(d) 主函数接到返回来的邻接表结构体,调用outL()函数,输出这个邻接表(e) 输入起点,调用DFS(Graph,v1,1);函数进展递归求解深度优先搜索并直接输出(f) 输入起点,调用BFS(Graph,v1);函数,求解广度优先搜索并直接输出(g) 输入起点、终点,调用Unwe
5、ighted ( Graph, v1 );函数求得起点到每个点的最短路径,再用distv2输出。(h) 如果distv2大于0证明v1可以到达v2,调用outpath(v2)输出路径(i) 输入起点、终点,调用Dijkstra(Graph,v1);函数求得起点到每个点的最短路径,再用distv2输出。(j) 如果distv2小于定义的INF,证明v1可以到达v2,再次调用outpath(v2)输出路径(k) 用MGraph gra;创建一个邻接矩阵之后,调用transform(Graph);进展邻接表与邻接矩阵的转换(l) outM(gra);函数,以二维数组的形式输出邻接矩阵(m) 调用Fl
6、oyd(gra,D,pa);函数求得多源最短路径,存储在D这个二维数组中,给出起点,终点直接输出。2.所有用到的抽象数据类型1边的定义 a表示边的起点和终点 b边的权重 2 邻接表的表结点的定义 a邻接点下标 b边权重 c指向下一个邻接点的指针 3邻接表的顶点表头结点的定义 a边表头指针 b存顶点的数据 c邻接表类型的 AdjList存储邻接表的头结点4 邻接表对应图结点的定义 a顶点数 b边数 c邻接表 5邻接矩阵的定义 a 顶点数 b 边数 c二维数组形式的邻接矩阵 6 BFS存数据的队列 a队头 front标记 b队头 rear标记 c存数据的数组7用于输出最短路径的栈 a栈顶top标记
7、 b存数据的数组3.设计程序的各个模块即函数功能与设计思想(1) CreateGraph( int VertexNum )函数功能:初始化一个有VertexNum个顶点但没有边的图 设计思想:a根据邻接表结构体分配一块空间b初始化图的顶点数和边数c初始化邻接表头指针d注意:这里默认顶点编号从1开始,到Graph-Nve初始化dist与path数组(2) InsertEdge( LGraph Graph, Edge E, int c )函数功能:在建立的图中插入边设计思想:a输入v1,v2,建立一个v2的新的邻接点b将V2插入V1的表头,用c做标志位,在调用函数时输入c假如c=2,表示图为无向图
8、,还要插入边 d接着为V1建立新的邻接点,将V1插入V2的表头 (3) BuildGraph()函数功能:输入顶点和边数,定义有向图和无向图,建立图,并返回邻接表类型的指针设计思想:a读入顶点个数,调用CreateGraph(Nv)初始化有Nv个顶点但没有边的图b读入边数,定义有向、无向,如果有边,建立边结点,读入边,格式为起点 终点 权重,插入邻接表c注意:如果权重不是整型,Weight的读入格式要改(4) clrv(LGraph g)函数功能:初始化图的访问数组Visited为0设计思想:重置被DFS和BFS修改正的visited数组(5) DFS( LGraph Graph, Verte
9、x V ,int x)函数功能: 以V为出发点对邻接表存储的图Graph进展DFS搜索设计思想:a首先访问出发点v,并将其标记为已访问过;b然后依次从v出发搜索v的每个邻接点w。假如w未曾访问过,如此以w为新的出发点继续进行深度优先遍历,直至图中所有和源点v有路径相通的顶点(亦称为从源点可达的顶点)均已被访问为止。c假如此时图中仍有未访问的顶点,如此另选一个尚未访问的顶点作为新的源点重复上述过程,直至图中所有顶点均已被访问为止。d也就是访问顶点v,从v的未被访问的邻接点中选取一个顶点w,从w出发进展深度优先遍历,重复上述两步,直至图中所有和v有路径相通的顶点都被访问到。(6) CreateQu
10、eue()函数功能:初始化一个队列设计思想:a队列的front与rear分别置-1b为数组分配空间7AddQ(Queue Q, Vertex S)函数功能:向队列中添加元素设计思想:a将rear位置挪一位b在rear这位参加一个数8 DeleteQ(Queue Q)函数功能:队列中删除一个元素,并返回设计思想:a从队列的头出队b也就是front位置加一c将front 这位的数据弹出9IsEmpty(Queue Q)函数功能:判断队列是否为空设计思想:a判断front的位置与rear是否相等10Unweighted ( LGraph Graph, Vertex S )函数功能:输入两点,求对应不
11、带权值的图的最短路径设计思想:a按照递增非递减的顺序找出各个顶点的最短路,类似于BFSb先创建空队列, MaxSize为外部定义的常数c初始化源点.distS = 0d对V的每个邻接点W-AdjVe假如W-AdjV未被访问过, W-AdjV到S的距离更新f将V记录在S到W-AdjV的路径上 11BFS( LGraph Graph, Vertex V)函数功能:向队列中添加元素设计思想:a顶点v入队列。b当队列非空时如此继续执行,否如此算法完毕。c出队列取得队头顶点v;访问顶点v并标记顶点v已被访问。d查找顶点v的第一个邻接顶点first。e假如v的邻接顶点first未被访问过的,如此first
12、入队列。f继续查找顶点v的另一个新的邻接顶点first,转到步骤e。g直到顶点v的所有未被访问过的邻接点处理完。转到步骤f。12 clr(LGraph Graph)函数功能:重置dist数组与path数组设计思想:a重置最短路径的举例与路径13FindMinDist( LGraph Graph, int collected )函数功能:传入一个dist中没有被收录(collected对应为-1)的数设计思想:aV从1到顶点最大的下标b假如V未被收录,且distV更小 c更新最小距离更新对应顶点 d 假如找到最小dist,返回对应的顶点下标e假如这样的顶点不存在,返回错误标记14Dijkstra
13、( LGraph Graph, Vertex S )函数功能:求出输入Vertex S的单源最短路径设计思想:aDijkstra算法开始采用的是一种贪心的策略,声明一个数组dist来保存源点到各个顶点的最短距离和一个保存已经找到了最短路径的顶点的集合Tb初始时,原点 s 的路径权重被赋为 0 diss = 0c假如对于顶点 s 存在能直接到达的边s,m,如此把dism设为ws, m,同时把所有其他s不能直接到达的顶点的路径长度设为无穷大d初始时,集合T只有顶点s。e从dis数组选择最小值贪心,如此该值就是源点s到该值对应的顶点的最短路径,并且把该点参加到T中,OK,此时完成一个顶点,f我们需要
14、看看新参加的顶点是否可以到达其他顶点并且看看通过该顶点到达其他点的路径长度是否比源点直接到达短,如果是,那么就替换这些顶点在dis中的值。g然后,又从dis中找出最小值,重复上述动作,直到T中包含了图的所有顶点。15transform(LGraph a)函数功能:邻接矩阵与邻接表转换设计思想:a分析邻接矩阵与邻接表的异同b邻接表有一个头结点数组,每一个对应一串链表,跟着的是每一个顶点与邻接点相连c邻接矩阵如此是一个二维数组,两点有边值为权重,没有如此初始化为无穷d先初始化一个空的二维数组e再对应邻接表每个头结点遍历其链表,将其值对应的参加到邻接矩阵中16outM(MGraph gra)函数功能
15、:传入邻接矩阵结构体,输出邻接矩阵设计思想:a相当于输出一个二维数组17outL(LGraph Graph)函数功能:传入邻接表结构体,输出邻接表设计思想:a第一个循环遍历每个头结点b在第一个循环中表结点的地址不为空如此输出还要输出权值18Floyd( MGraph Graph, WeightType DmaxVnum, Vertex pathmaxVnum )函数功能:Floyd算法求出多源最短路径设计思想:a通过Floyd计算图G=(V,E)中各个顶点的最短路径时,需要引入两个矩阵,矩阵S中的元素aij表示顶点i(第i个顶点)到顶点j(第j个顶点)的距离。矩阵P中的元素bij,表示顶点i到
16、顶点j经过了bij记录的值所表示的顶点。b假设图G中顶点个数为N,如此需要对矩阵D和矩阵P进展N次更新。c初始时,矩阵D中顶点aij的距离为顶点i到顶点j的权值d如果i和j不相邻,如此aij=,矩阵P的值为顶点bij的j的值e,对矩阵D进展N次更新f第1次更新时,如果aij的距离 “ai0+a0j(ai0+a0j表示i与j之间经过第1个顶点的距离),如此更新aij为ai0+a0j,更新bij=bi0。g同理,第k次更新时,如果aij的距离 “aik-1+ak-1j,如此更新aij为aik-1+ak-1j,bij=bik-1。更新N次之后,求出最短路径19Strack createStr()函数
17、功能:创建一个栈设计思想:a分配空间,top = -120push(Strack ptr,int v)函数功能:向栈中添加元素设计思想:atop加一b对应位置存为v21pop(Strack ptr)函数功能:出栈设计思想:a先将栈顶元素弹出,top减一22sIsEmpty(Strack ptr)函数功能:判断栈是否为空设计思想:a假如果top=-1,为空,否如此返回023outpath(int v)函数功能:输出最短路径设计思想:a由于存最短路径的path数组每位存的只是上一个顶点,所以每次查找都会不断地找到每个顶点的上级,直至pathv=-1,会形成一个方向的路径,就要利用堆栈后进先出的特点
18、输出。b在path存的数据不为-1时,将他们全部压入栈中,再将他们全部输出3、 详细设计1. 程序流程图建立图插入边初始化图BFSDFS创建邻接表D无权图最短路径转邻接矩阵Dijkstra算法求最小值Floyd算法2. 数据类型的实现1边的定义 typedef struct ENode *PtrToENode;struct ENode Vertex V1, V2; /* 有向边 */ WeightType Weight; /* 权重 */;typedef PtrToENode Edge;2 邻接表的表结点的定义 typedef struct AdjVNode *PtrToAdjVNode;st
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 路径

链接地址:https://www.desk33.com/p-23170.html