ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:505.45KB ,
资源ID:3645970      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3645970.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C语言迪杰斯特拉实现最短路径算法.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

C语言迪杰斯特拉实现最短路径算法.docx

1、C语言迪杰斯特拉实现最短路径算法数据结构课程设计报告-旅游咨询系统设计旅游咨询系统设计一、需求分析 在交通网络日益发达的今天,人们出行有很多种方式、路线,而如何选择符合需要的方式路线成为大家的一大难题。所以,在此我利用计算机建立一个旅游咨询系统。在系统中采用图来构造各个城市之间的联系,图中顶点表示城市,边表示各个城市之间的路线,所带权值为两个城市间的路程、时间或车费等。这个交通咨询系统可以回答旅客提出的各种问题,例如:如何选择一条路径使得从A城到B城里程最短;如何选择一条路径使得从A城到B城花费最低;如何选择一条路径使得从A城到B城所用的时间最少等等的一系列问题。二、系统分析设计一个旅游咨询系

2、统,能咨询从任何一个城市顶点到其他城市顶点之间的最短路径(里程)、最低花费或是最少时间等问题。对于不同的咨询要求,可输入城市间的路程、所需时间或是所需费用等信息。旅客可以在同一个系统中综合考虑自己的各目标城市,选择一个最佳的旅游路线和出行方式。针对最短路径问题,在本系统中采用图的相关知识,采用了迪杰斯特拉算法,解决在实际情况中的最短路径问题,而迪杰斯特拉算法的时间复杂度为O(n2),空间复杂度为O(n)。本系统使用邻接矩阵存储无向图。其中,建立矩阵的时间复杂度为O(n2),但是利用其查找一条边的时间复杂度为O(1)。本系统中包括了利用邻接矩阵建立图的存储结构和单源最短问题两大部分,使用指针数组

3、实现利用一个程序实现最短路径和最短时间的运算。并且本系统设置了人性化的系统提示菜单,方便使用者的使用。三、概要设计一、系统划分该系统可以划分为三个部分:1、利用邻接矩阵建立图的存储结构;2、利用迪杰斯特拉算法解决单源最短路径问题;3、实现城市之间的最短路径问题和最短时间问题。二、邻接矩阵建立流程图:四、详细设计本课程设计的源程序如下所示:#include#include#define MVNum 100#define Maxint 9999 /*将无穷大的数值设为9999*/typedef char vertextype;/*建立无向图*/typedef int adjmatrix;typed

4、ef struct vertextype vexsMVNum; adjmatrix arcsMVNumMVNum;mgraph;mgraph *G2; /*设置指针数组用以实现距离和时间最小值求取*/void city_number() /*输出城市代表序号*/ printf(*n); printf( 1、北京 2、上海 3、香港 4、天津 5、重庆 6、澳门 7、哈尔滨 8、石家庄); printf( n 9、兰州 10、昆明 11、成都 12、长春 13、沈阳 14、长沙 15、海口 16、西安);printf(n*n);void Createmgraph(int a,int n,int

5、e) /*建立无向邻接矩阵*/ int i,j,k; int w; for(i=1;i=n;i+) for(j=1;jarcsij=0; /*邻接矩阵对角线初始值设为0*/ else Ga-arcsij=Maxint; /*其他元素设为无穷大*/ for(k=1;karcsij=w; Ga-arcsji=w; void Dijkstra(int a,int v0,int N)/*Dijkstra算法的实现和打印*/ enum boolean SMVNum; /*终点集合*/ int distMVNum,pathMVNum; /*dist表示源点v0到图中其余顶点的最短长度,path表示其对应的

6、路径*/ int i,wmin,u,num=1,k; for(i=1;iarcsv0i; /*数组dist初值为邻接矩阵*/ Si=0; /*集合S初值设为空集*/ if(distiMaxint) pathi=v0; else pathi=0; Sv0=1; /*源点v0放入集合S中*/ pathv0=0; dowmin=Maxint; /*wmin最小值设为无穷大*/ u=v0; for(i=1;i=N;i+) if(Si=0) /*选择不在S中且距离最小的顶点u*/ if(distiwmin)&(disti!=0) u=i; wmin=disti; Su=1; /*把距离最小的顶点u放入集

7、合S中*/ for(i=1;iarcsuiarcsui; pathi=u; num+; while(num=N); printf(nt输出带权无向图的单元最短路径为:nt);/*打印v0到其他顶点的最短路径*/ for(i=1;i=N;i+) if(Si=1) k=i; printf(nt顶点%d到%d之间的路径为:,v0,i); while(k!=v0) printf(%d-,k); /*输出后继顶点*/ k=pathk; /*继续寻找下一个后继顶点*/ printf(%d,k); /*输出终点*/ printf(,最短路径长度为%dn,disti); /*输出最短路径*/ else pri

8、ntf(nt顶点%d到%d之间没有路径!,v0,i); printf(nt求一个城市到所有城市的最短路径结束,谢谢!nntt);void main() /*旅游咨询系统*/int n,e,v,u,i,x;int z=0;G1=(mgraph *)malloc(sizeof(mgraph); /*建立类型为mgraph的十字链表结构*/G2=(mgraph *)malloc(sizeof(mgraph);printf(*欢迎使用旅游咨询系统*n);printf(输入图中顶点个数和边数n,e:);scanf(%d,%d,&n,&e);city_number();for(i=1;ivexsi=x;

9、/*将顶点信息输入一维数组中*/ G2-vexsi=x; printf(n请输入距离矩阵的数值n);Createmgraph(1,n,e); /*建立距离矩阵*/ printf(n距离矩阵建立完毕n请输入时间矩阵的数值);Createmgraph(2,n,e); /*建立时间矩阵*/printf(n无向图的存储结构建立完毕!n);do printf(nnn*进行最短查询*n);printf(=n);printf(1.求一个城市到所有城市的最短路径n);printf(2.求一个城市到所有城市的最短时间n);printf(3.退出n);printf(=n);printf(请输入选择:);scanf

10、(%d,&z); /*输入选择选择矩阵*/ city_number();if(z=1) printf(n选择1 求一个城市到所有城市的最短路径n);printf(求单源路径,输入源点v :); /*输入源点v0*/scanf(%d,&v);Dijkstra(1,v,n); /*计算最短距离*/else if(z=2) printf(n选择2 求一个城市到所有城市的最短时间n);printf(求单源路径,输入源点,u :);scanf(%d,&u);Dijkstra(2,u,n); /*计算最短时间*/ else if(z=3) printf(n结束查询!谢谢使用!n);else printf(

11、输入错误!n); /*输入不为1-3则重新选择*/ while(z!=3); /*输入3则退出*/printf(谢谢您的使用,再见n);五、调试分析一、运行结果1、输入顶点总数为6,边的总数为10,并输入顶点信息。2、输入距离矩阵的端点以及其权值w。3、输入时间矩阵的端点以及其权值w。4、邻接矩阵建立完毕。输入选择1求城市3即香港到其他城市的最短路径。5、求解城市3即香港到其他城市的最短路径结果如图所示。6、输入选择2求城市3即香港到其他城市的最短时间。7、求解城市3即香港到其他城市的最短时间结果如图所示。8、输入选择3退出旅游咨询系统。二、改进设想由于本系统为旅游咨询系统,所以可以添加一个排

12、序算法将所有输入的方案储存起来并且综合进行排序,选出最符合要求的目标城市。此外,以数字代替城市名在查询的时候仍然不是很方便,如果能用数组储存好城市名,然后调用数组显示城市名将更方便查询。最后,还可以考虑加一个算法得出中转站最多和最少的路线。六、课设总结本次课程设计已经进入尾声,通过这次课程设计,我对图的概念有了新的认识,对于数据结构这门课程也有了进一步的了解。这次课程设计从选材到实施我都遇到了一些小问题。首先是选材问题,数据结构这门课程涉及很广,运用的方面也很多。刚开始我准备利用双向链表建立一个学生宿舍管理系统,但是很快我就觉得这个方案没有亮点和新意,而当时我们正在学习图,我也对它的应用感到有

13、兴趣,于是,我决定利用图求最短路径。在我和其他同学进行交流后发现大家做图的人也不少,但是大家大都偏向于Floyd算法。所以我决定使用Dijkstra算法来完成。很快我就发现这个算法的资料很少,即使有,也是C+程序的。但是我没有退却,我从书本中找到Dijkstra算法的实现程序,细细研究,将它每句程序都研究透彻,再联合邻接矩阵将算法实现。我首先将Dijkstra算法和邻接矩阵写成子程序形式,利用主程序将他们联系在一起,用以实现最短距离的求取,但是,我发现地点没办法表示在屏幕上。在我和老师进行交流时,老师建议我利用数字代替城市进行输出,并且尝试一下完成时间最短的求取。我采取老师的建议利用数字代替城

14、市进行输出,并且思考如何利用同一个程序完成距离最短和时间最短的求取,然后我想到了C语言中学习到的指针数组,于是我利用G1指向距离矩阵,G2指向时间矩阵来完成要求。最后,我在进行调试的时候发现当我再输入I,j,w值时如果输入的数值为1,2,2(即1城市到2城市的距离为2)和2,3,3(即2城市到3城市的距离为3)时,系统输出显示从1-3没有路径,而3-1有路径,而如果我输入1,2,3,和2,3,2时,系统输出显示从1-3有路径,而3-1没有路径。在进行多次试验并确认矩阵算法没有错误后,我锁定错误出现在Dijkstra算法中的将最短距离顶点放入集合S中的那段程序中。在我仔细检查程序后发现书上我所参

15、考的程序语句if((distu+Ga-arcsuiarcsuiwmin)出现错误,因为,此时wmin为distu的值。以我所列举的第一种情况为例,在讨论源点为1终点为3时,即要求为2+3小于无穷大,并且33没有路径。完成了课程设计后。我觉得我收获不少,首先是不能人云亦云,看见别人做什么于是也跟着干什么,得有自己的新意,做出自己的风格;其次,遇到问题不要马上想到求助,应该自己冷静下来想想应该如何靠自己的力量解决;再者,在调试程序甚至干其他事情的时候,应该学会使用排除法将大化小,将目标锁定在一个最小范围内,便于解决;最后,不要盲目相信权威,要有自己的思想,敢于质疑。通过这次课程设计,我发现我自己对程序设计产生了前所未有的兴趣,并且也有了自信,以前总害怕自己调试不出来,现在可以放手去调试,这是我的一大进步。在写程序的时候,发现自己的知识太少了,只有一个模糊的概念,这都归咎于我的练习太少了,在调试的时候出现的问题,不断的修改就是不断的学习过程。当我全身心投入到里面的时候,发现这也是一件很有趣的事情。所以在以后的学习中,我应该多加练习,加强自学的能力,多编写程序,争取早日能够灵活的运用它。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1