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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

求解最短路径的Dijkstra算法.docx

1、求解最短路径的Dijkstra算法 一、问题分析与任务定义本题主要是利用Dijkstra算法来求解顶点之间最短路径,其中包括如下几个待解决的问题:1 问题分析选择合适的结构表示图主要包括:用Dijkstra算法实现起来更要容易;时间复杂度小;自己可以熟练应用。Dijstra算法的实现所应涉及到的各参数及变量:顶点的编号;各边权的初使化;如何求出从顶点到其他各点的最短距离;最短距离长度的求取等问题。2 任务定义对任意图,选择合适的数据结构表示图,在此基础上实现求解最短路径的Dijkstra算法。要求:对所设计的图的数据结构,提供必要的基本功能。在带权的有向图中源点到终点的多条路径中寻找出一条各边

2、权植之和最小的路径,即最短路径。对任务的理解考虑设计的图结构是否具备必要的基本功能,具有实际的应用;图的邻接矩阵如何实现交互式;如何将输入的邻接矩阵溶入到dijstra 算法中去。需要解决什么样的实际问题。并且能够将程序与实际问题相结合,能够处理一般的最短路径问题。二、概要设计和数据结构的选择按路径长度递增的顺序产生最短路径。通过以上对问题的分析和任务的理解,设计出一个大体的模块和程序流程。1程序中涉及到的结构体及子函数:1.1结构体:本程序设计使用了以下结构体:struct vertex int num; /顶点编号 int data; /顶点信息 ; /顶点类型 typedef struc

3、t graph int n; /图中顶点个数 int e; /图中边的个数 struct vertex vexsMAXVEX; /顶点集合 int edgesMAXVEXMAXVEX; /边的集合 AdjMaxix; /图的邻接矩阵类型1.2子函数:设计本程序需分成几个模块,要用到以下几个子函数:AdjMaxix creatmgraph() /通过用户交互产生一个有向图的邻接矩阵;void dispmgraph(AdjMaxix adj)/用于输出一个有向图的邻接矩阵;void ppath(int path,int i,int v0);/选择输出一条最短路径void DisPath(int d

4、ist,int path,int s,int n,int v0)/用path计算最短路径void Dijkstra(AdjMaxix g,int v0) / Dijkstra算法void change(int num) /用于替换顶点编号1.3结构图与流程图1.3.1结构图 图1 结构图1.3.2 流程图 yes 图2 程序流程图三、详细设计和编码这里设计用邻接矩阵解决实际生活中城市间往返最短路径问题。1 算法思想把图中顶点集合分成两组,第一组为集合S,存放已求出其最短路径的顶点,第二组为尚未确定最短路径的顶点集合是V-S(用U表示),其中V为网中所有顶点集合。在这里我们设计一个有向图G=(V

5、,E)为G地区的交通图。1.1在这个图中,V=(1,2,N)代表各个城市。edges是表示G的邻接矩阵,edgesIj表示有向边的权,这里的权值代表城市间距离。若不存在有向边的权,则edgesIj的权为无穷大(可取值为INF=32570)。设S为一个集合,其中的每个元素表示一个城市,求出从源点(自定义)城市到这些顶点城市的最短距离。S的初态只包含顶点V0。数组dist记录从V0到其他各城市当前的最短距离,其初值distI=edgesV0I。从S之外的顶点集合V-S中选出一个城市u。使distw的值最小。于是从源点到达u只通过S中的城市,把u加入集合S中调整dist中记录的从源点到V-S中每个城

6、市V的距离:从原来的distv和distw+edgeswv中选择较小的值作为新的distv。重复上述过程,直到S中包含V中其余顶点的最短路径。1.2算法描述:void Dijkstra(AdjMaxix g,int v0)int distMAXVEX,pathMAXVEX;int sMAXVEX; int mindis,i,j,u,n=g.n; for(i=0;in;i+) disti=g.edgesv0i; si=0; if(g.edgesv0iINF) pathi=v0; else pathi=-1; sv0=1;pathv0=0; for(i=0;in;i+) mindis=INF; u

7、=-1; for(j=0;jn;j+) if(sj=0 & distjmindis) u=j; mindis=distj; su=1; for(j=0;jn;j+) if(sj=0)if(g.edgesujINF&distu+g.edgesujdistj) distj=distu+g.edgesuj; pathj=u; 2 采用邻接矩阵的存储结构2.1图的邻接矩阵可以使用一个二维数组存储顶点之间相邻关系的邻接矩阵,和一个具有N个元素的一维数组存储顶点信息,其中下标为i的元素存储顶点Vi的信息。2.2算法描述:void Creatdl(vexlist GV,adjmatrix GA,int n,

8、int e) int I,j,k,w;cout”输入”n”个顶点”endl;for(I=0;IGVI;for(I=0;In;I+) for(j=o;jn;j+)if(I=j) GAIj=o;else GAIj=MaxValue; cout”输入”e”条边”endl;for(k=1;kIjw;GAIj=GAIj=w;四、上机调试对设计实现的回顾讨论和分析;算法的时、空性能分析和改进设想,经验和体会等。1调试中遇到的问题与解决方法1.1在进行输入输出语句的调试时,系统提示无法识别函数,缺少头文件;1.2出现重大错误,多达数百条错误,着实郁闷了一阵;很多标点符号是在中文输入法状态下输入,造成系统无法

9、识别,改掉后错误消失;如switch语句,在每条选择语句后,缺少break(),错误;1.3函数方法使用有误,无法通过;在赋实参时,对于变化的实参只需赋初值,子函数也可以调用子函数;1.4困惑很久的调用子函数问题,在赋实参时找不到实参;用switch语句进行相关选择代换,成功。1.5连系实际问题上,int型与char型的替换上不知道用什么函数实现;2设计体会对C语言的使用不是很熟练,造成自己浪费很多时间在复习C语言,如:结构体的使用,不能灵活应用do,while( ),switch( ) 语句等;调用子函数问题上,子函数之间错综复杂的调用和实参,形参的赋值让自己很是迷惑,三天时间,也许更多时间

10、里,都是在研究怎样调用子函数。虽然最后基本是完成了教授布置下来的课程设计,但是还是有不尽人意的地方:结点的插入,删除,路径的实际化最终由于时间问题没能解决,很遗憾。程序缺乏人性化设计,估计第一次使用本程序的人会很迷茫。3时间空间复杂度的计算利用Dijkstra算法求解最短路径时,求每一对顶点之间的最短路径的一种方法是反复执行n次Dijkstra算法, 每次执行以一个顶点为源点, 求得从该顶点到其它各顶点的最短路径; 其时间复杂度为O(n3)。其空间的复杂度为o(n)。五、用户使用说明本程序主要是用来计算从某一点到其他各点的最短路径长度,第一次使用可能会有点迷茫,但是它却是本人两周来的血汗,如有

11、不便请原谅。下面描述该使用方法:程序会在一开始让用户输入结点数,线路数,然后输入相关结点信息,有城市名字(只能使用英文名称),线路长度,起点城市,终点城市。接下来都由计算机完成。结果会输出源点到各城市间的长度。六、测试结果 输入数据 : 输入城市数为:4输入城市线路为:4 然后输入城市信息(这里每个数字代表1 A地 2 B地 3 C地 4 D地):输入第一个城市信息:1 输入第二个城市信息:2 输入第三个城市信息:3 输入第四个城市信息:4 输入第一条线路的起点:1 ,终点:3 线路长度为:56输入第二条线路的起点:2 ,终点:3线路长度为:78输入第三条线路的起点:1 ,终点:2 线路长度为

12、:89输入第三条线路的起点:3 ,终点:4线路长度为:99下面是结果截图: 图3 输入所有城市信息 图4 输出最短路径七、参考书目1 徐孝凯 数据结构实用教程,清华大学出版社,1999年12月第1版。2 谭浩强 c语言程序设计,清华大学出版社。3 李春葆 数据结构习题与解析,清华大学出版社,2004年2月第2版。4 数据结构-C+语言描述,人民邮电出版社,2005年三月第1版。5 数据结构(C语言描述),清华大学出版社,2004年十月第1版。八、附录:带注释的源程序 /*-*/* */ /*用Dijkstra算法求出有向图中某个源点到其他各顶点的最短路径长度*/ /* */ /*-*/#inc

13、lude #include #include #include #define INF 32767#define MAXVEX 100#define MAX 12struct vertex int num; /顶点编号 int data; /顶点的信息 ; /顶点类型typedef struct graph int n; int e; /图中顶点的个数和边的个数 struct vertex vexsMAXVEX; /顶点集合 int edgesMAXVEXMAXVEX; /边的集合 AdjMaxix; /图的邻接矩阵类型AdjMaxix creatmgraph() /通过用户交互产生一个有向图

14、的邻接矩阵 int i,j,k,w,n,e; int b,t; AdjMaxix adj; coutn; while(nMAX|n0) cout城市个数不正确!请重新输入!n; coute;adj.n=n;adj.e=e;cout输入城市信息:n; for(i=0;in;i+) cout第i+1adj.vexsi.data; adj.vexsi.num=i; for(i=0;in;i+) for(j=0;jn;j+) adj.edgesij=0; for(k=0;ke;k+) cout第k+1条线路:endl; coutb; coutt; coutw; i=0; while(i=n) cout

15、输入的起点城市不存在!n; abort(); j=0; while(j=n) cout输入的终点不存在!n; abort(); adj.edgesij=w; return(adj);void dispmgraph(AdjMaxix adj)/用于输出一个有向图的邻接矩阵 int i,j,n,e; n=adj.n; e=adj.e; cout输出线路的矩阵表示:endl; cout ; for(i=-1;in;i+) printf(%6d,i); printf(n); coutendl; for(i=0;in;i+) printf(%6d,i); for(j=0;jn;j+) if(adj.ed

16、gesij=0) printf(%6s,); else printf(%6d,adj.edgesij); coutendl; void ppath(int path,int i,int v0) int k; k=pathi; if(k=v0) return; ppath(path,k,v0); printf(%d,k);void DisPath(int dist,int path,int s,int n,int v0) int i; /用path计算最短路径 printf( path: ); /输出path值 for(i=0;in;i+) printf(%3d,pathi); printf(n

17、); for(i=0;in;i+) /用于输出最短路径和路径长度 if(si=1 & i!=v0) printf(从%d到%d的最短路径为:,v0,i); printf(%d,v0); ppath(path,i,v0); printf(%dn,i); else printf(从%d到%d不存在路径n,v0,i);void Dijkstra(AdjMaxix g,int v0) int distMAXVEX,pathMAXVEX; int sMAXVEX; int mindis,i,j,u,n=g.n; for(i=0;in;i+) disti=g.edgesv0i; /距离初始化 si=0;

18、/s置空 if(g.edgesv0iINF) /路径初始化 pathi=v0; else pathi=-1; sv0=1;pathv0=0; /源点编号v0放入s中 for(i=0;in;i+) /循环直到所有顶点的最短路径都求出 mindis=INF; u=-1; for(j=0;jn;j+) /选取不在s中且具有最小距离的顶点u if(sj=0 & distjmindis) u=j; mindis=distj; su=1; /顶点u加入s中 for(j=0;jn;j+) /修改不在s中的顶点的距离 if(sj=0) if(g.edgesujINF & distu+g.edgesujdist

19、j) distj=distu+g.edgesuj; pathj=u; printf(输出最短路径:n);DisPath(dist,path,s,n,v0); /输出最短路径void change(int num) /选择语句用于替换顶点值,输出名称 switch(num) case 1: printf(A地);break; case 2: printf(B地);break; case 3:printf(C地);break; case 4:printf(D地);break; case 5:printf(E地);break; case 6:printf(F地);break; case 7:prin

20、tf(G地);break; case 8:printf(H地);break; case 9:printf(I地);break; case 10:printf(J地);break; case 11:printf(K地);break; case 12:printf(L地);break; void main() int i;char x; do /循环函数,使程序可以循环使用 printf(下面每个数字代表一个城市,请输入相应的代码,第一个输入的是出发地!nn); printf(1 A地 2 B地 3 C地 4 D地 5 E地 6 F地 n7 G地 8 H地 9 I地 10 J地 11 K地 12 L地n); AdjMaxix g=creatmgraph(); int n=g.n; dispmgraph(g); Dijkstra(g,0); printf(从出发地到各地最短路程长度如下,若长度为0则表示无法到达或在本地:n); for(i=0;i); change(g.vexsi.data); printf( %3dKmn,g.edges0i); printf(nn谢谢使用WOW路径查讯系统,如果想退出请输入 # ,任意键继续: ); scanf(%c,&x); printf(n); while(x!=#); /输入n结束程序九、指导教师评语

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

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