1、最短路径是否存在,存在的情况最短路径是多少,其次是不存在。5.问题分析 实现本程序要解决以下几个问题:如何存储一个有向图。如何在界面中输出该有向图。如何定义起始源点。如何选择出最短路径。找到的最短路径如何输出。第 2章 数据结构的选择和概要设计 1.数据结构的选择:在图的结构中,任意两个顶点之间都可能存在关系,比线性表和树要复杂。由于不存在严格的前后顺序,因而不能采用简单的数组来存储图;另一方面,如果采用链表,由于图中各顶点的度数不尽相同,最小度数和最大度数可能相差很大,如果按最大度数的顶点来设计链表的指针域,则会浪费很多存储单元,反之,如果按照各个顶点设计不同的链表结点,则会给操作带来很大的
2、困难。在此我选用邻接矩阵的存储结构。采用邻接矩阵存储,很容易判断图中两个顶点是否相连,也容易求出各个顶点的度。不过任何事情都不是完美的,采用邻接矩阵存储图时,测试其边的数目,必须检查边二维数组的所有元素,时间复杂度为 O(n2),这对于顶点很多而边较少的图(稀疏图)是非常不合算的。以邻接矩阵存储有向图。2.概要设计 对于最短路径问题:最短路径是在实际应用中非常有用的工具,我们常见的两种最短路径是:(1)从某源点到其余各顶点之间的最短路径。(2)每一段顶点之间的最短路径 在这里我们解决第一类问题。Dijkstra算法用于求最短路径:Dijkstra算法是按路径长度递增的次序逐步产生源点到其他顶点
3、间的最短路径。算法建立一个顶点集合 S,初始时该集合只有源点 V0,然后逐步将已求得最短路径的顶点加入到集合中,直到全部顶点都在集合 S 中,算法结束。2.3 Dijkstra算法思想 设 costi,j=0,S 为已经求得最短路径的顶点集合,distancei数组的每个元素表示当前状态下源点 V0到 Vi 的最短路径。算法如下:1)初始化:S=V0,distancei=cost0,i。2)选择一个终点 Vj,满足 distancej=MIN distancei|ViV-S。3)把 Vj 加入到 S 中。4)修改 distance数组元素,修改逻辑为对于所有不在 S 中的顶点 Vi.if(di
4、stancej+costi,j distancei)distancei=distancej+costi,j 5)重复操作 2)、3)、4),直到全部顶点加入到 S 中。输入顶点名称 输入每条边的信息 返回每个结点 的位置 创建图 Dijkstra算法的实现 Dwarcsij.info=NULL;for(k=0;karcnum;k+)dj=n;nfo=NULL;djarcsjk.adj);else printf(t 3000);node0=v0 初始化记录经过的顶点数都为 0。pathi.num=0;初始化顶点集合 s 为空,即还未开始。si=0;a)源点的选择:将 v0顶点加入到顶点集合 s
5、中。sv0=1 b)利用 for循环选择一个终点 Vj,使其满足 V0到 Vj 距离最短,同时将 Vj 加入集合S 中。c)根据 j 顶点调整当前的最短路径,若满足 disti distj+costji,则修改 disti的值。同时 V0到 Vi 的最短路径中经过的顶点数加 1,即 pathi.num+;并将经过的顶点存入数组 pnode即 pathi.pnodepathi.num=j d)此时一趟求最短路径完毕,将终点 V1添加到路径中。e)循环执行 d),e),f)操作,直到全部顶点加入到 S 中。第 4章 上机调试 记录调试过程中错误和问题的处理 1)当输入格式不符合程序要求时,会出现循
6、环 2)当两顶点间没有路径时,权值为无穷大,但在本程序中只能用一个具体的数字2000 代替抽象的无穷大。3)在程序的调试过程可暂时多加一些输出语句以便及时查看一下中间运行情况,并对程序规格说明作调整和改动。算法的时间和空间性能分析 时间复杂度 对于 n个顶点的有向图,求一个顶点到其他顶点的最短路径的时间为 O(n),调整最短路径的循环共执行 n-1 次,是二层循环,所以,时间复杂度是 O(n2)。空间复杂度 采用邻接矩阵存储有向图,应处理每两个顶点之间的关系,所以空间复杂度为 O(n2)。算法设计、调试的经验和体会 Dijkstra算法在上课的时候曾作为重点讲过,所以在做查找最短路径的算法时很
7、流畅,但是在输出最短路径的时候遇到了很大的阻力。因为在定义结点时,使用的是结构体数组,所以当处理 V0到每个结点的最短路径时,导致无法具体记录经过的顶点数,只能记录源点、终点前一顶点以及终点。所以本程序在输出最短路径时有较大的瑕疵,还需进一步修改。第 5章 测试结果 测试结果:注意问题:1、输入顶点个数:最大不超过 25,请输入罗马数字,若输入其他符号,无意义;2、以“字母 字母 数字”的格式输入图的信息,输入第一个字母为原点,第二个字母为终点,输入“数字”为权值,最后输入一个“字母”为顶点输入。输入完成;3、在输入完成后,屏幕显示邻接矩阵与最短路径。第 6章 学习心得体会 通过对本次课程设计
8、的学习与交流,使我学习到一部分很重要的关于编程方面思想,同时也获得了部分学习其他学科的方法。学习重在于体会,体会这种学科给我带来的思考,给我带来由浅入深的演算心得。做一次课程设计,不仅仅是为了完成某项任务,而在于是否能从这次任务中总结出一些处理同类任务的方法和技巧。每次全力的付出,都会有或多或少的收获。通过对本次课程设计涉及的问题的分析和处理,了解到学习数据结构对编程的技巧和思想方法。以前也了解过数据结构相关的书籍,但没有深入的学习,本次上机课程设计从选题上也把学习的方法应用其中,在编程时算法的理解和分析十分重要,首先的弄懂它的基本框架,用什么来算法来实现,最后通过查找部分资料,修改调试,总结
9、心得,就是一种进步。第 7章 参考文献:严蔚敏 吴伟明 编著的数据结构(C 语言版):杨晓波 主编 王 弘 王聪华 胡 永 副主编的 数据结构实验指导(C 语言版)附件:#include#include#define MAX_VERTEX_NUM 25 dj=INFINITY;G-arcsij.info=NULL;dj;dj)arcsin.adj;pathn=i;/if /for for(m=0;mvexnum;m+)if(finalm=1&m!=w)printf(t 从%c到%c 的最短路径长度为:%dt 路径是:,G-vexsw,G-vexsm,Dm);/输出最大值时则表示两点之间没有最短路径 Short(G,path,m,w);printf(%c,G-vexsm);printf(n);else printf(t 从%c到%c没有不存在路径!n,G-vexsw,G-vexsm);/判断是否存在最短路径 main()MGrph m;VertexType ch;int j;Creat_YG(&m);juzhen(&printf(n 请输入要开始的顶点:);scanf(%c,&ch);j=LocateVex(&m,ch);getchar();ShortestPath(&m,j);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1