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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

数据结构实验报告五最短路径Word文档下载推荐.docx

1、弗洛伊德算法的具体流程图三、概要设计:程序中将涉及下列两个抽象数据类型:一个是图,一个是队列。 1、设定“图”的抽象数据类型定义:ADT Graph 数据对象 V:V 是具有相同特性的数据元素的集合,称为顶点集。数据关系 R:R=VRVR = | v, w VP(v, w), 表示从v到w的弧, 谓词P(v, w)定义了弧 的意义或信息基本操作 P:CreateGraph(&G,V,VR);初始条件:V 是图的顶点集,VR 是图中弧的集合。 操作结果:按 V 和 VR 的定义构造图。LocateVex(G,u);图 G 存在,u 和 G 中的顶点有相同特征。操作结果:若 G 中存在顶点 u,则

2、返回该顶点在图中位置;否则返回其他信息。First_next_adj(G,v) ; 初始条件:图 G 存在,v 是 G 中某个顶点。返回 V 的第一个邻接顶点。若顶点在 G 中没有邻接顶点,则返回“空” 。DFSTraverse(G,i);图 G 存在,i 为某个顶点在邻接矩阵中的位置。以 i 为起始点,对图进行深度优先遍历。 BFSTraverse(G,i);以 i 为起始点,对图进行广度优先遍历。 ADT Graph 2、设定队列的抽象数据类型定义:ADT Queue 数据对象:D= a i a i BiTree, i N+ 数据关系:R1=| a i 1 , a i D ,i=2,,n

3、约定 a1 端为队列头, a n 端为队列尾。基本操作:InitQueue(&Q) 构造一个空队列 Q。EnQueue(&Q,&e) 队列 Q 已存在。插入元素 e 为 Q 的新的队尾元素。DeQueue(&删除 Q 的对头元素,并返回其值。QueueEmpty(&若 Q 为空队列,则返回 1,否则 0。QueueLenghth(Q) 返回 Q 的元素个数,即队列长度。GetHead(Q,&Q 为非空队列。用 e 返回 Q 的对头元素。 ADT Queue 3、本程序包含三个模块1)主程序模块 void main( ) 选择欲建图的类型;构建图并对其用邻接矩阵的形式打印;对图进行深度和广度优先

4、搜索以及求某个顶点的第一邻接点;求某一源点到其余顶点的最短路径。 2)图模块实现图的抽象数据类型和基本操作 3)队列模块实现队列的抽象数据类型及今本操作3.1 程序流程图四、详细设计:4.1建立图的存储结构首先定义交通图的存储结构。邻接矩阵是表示图形中顶点之间相邻关系的矩阵。设G=(V,E)是具有n个顶点的图,则G的邻接矩阵是具有如下定义的n阶方阵。Ai,j=当邻接矩阵的行表头、列表头顺序一定时,一个图的邻接矩阵表示是唯一的。图的邻接矩阵表示,除了需用一个二维数组存储顶点之间的相邻关系的邻接矩阵外,通常还需要使用一个具有n个元素的一维数组来存储顶点信息,其中下标为i的元素存储顶点i的信息。因此

5、,图的邻接矩阵的存储结构定义如下:#definf MVNum 88 /最大顶点数typedef struct VertexType vexsMVNum; /顶点数组,类型假定为char型 Adjmatrix arcsMVNumMVNum; /邻接矩阵,假定为int型MGraph;4.2单源最短路径最短路径的提法很多。在这里先讨论单源最短路径问题:即已知有向图(带权),我们希望找出从某个源点SV到G中其余各顶点的最短路径。为了叙述方便,我们把路径上的开始点称为源点,路径的最后一个顶点为终点。那么,如何求得给定有向图的单源最短路径呢?迪杰斯特拉(Dijkstra)提出按路径长度递增产生诸点的最短路

6、径算法,称之为迪杰斯特拉算法。迪杰斯特拉算法求最短路径的实现思想是:设G=(V,E)是一个有向图,结点集为,cost是表示G的邻接矩阵,costij表示有向边的权。若不存在有向边,则costij的权为无穷大(这里取值为32767)。设S是一个集合,其中的每个元素表示一个顶点,从源点到这些顶点的最短距离已经求出。设顶点v1为源点,集合S的初态只包含一个元素,即顶点v1。数组dist记录从源点到其他顶点当前的最短距离,其初值为disti=costv1i,i=1,2,n。从S之外的顶点集合V-S中选出一个顶点w,使distw的值最小。于是从源点到达w只通过S中顶点,把w加入集合S中,调整dist中记

7、录的从源点到V-S中每个顶点v的距离:从原来的distv和distw+costwv中选择较小的值作为新的distv。重复上述过程,直到V-S为空。最终结果是:S记录了从源点到该顶点存在最短路径的顶点集合,数组dist记录了源点到V中其余各顶点之间的最短路径,path是最短路径的路径数组,其中pathi表示从源点到顶点i之间的最短路径的前驱顶点。因此,迪杰斯特拉算法可用自然语言描述如下:初始化S和D,置空最短路径终点集,置初始的最短路径值;Sv1=TRUE; Dv1=0; /S集初始时只有源点,源点到源点的距离为0;While (S集中顶点数n)开始循环,每次求得v1到某个v顶点的最短路径,并加

8、v到S集中;Sv=TRUE;更新当前最短路径及距离;4.3任意一对顶点间最短路径任意一对顶点间最短路径问题,是对于给定的有向网络图G=(V,E),要对G中任意一对顶点有序对“v,w(vw)”,找出v到w的最短路径。要解决这个问题,我们可以依次把有向网络图中每个顶点作为源点,重复执行前面讨论的迪杰斯特拉算法n次,即可以求得每对顶点之间的最短路径。这里还可以用另外一种方法,称作费洛伊德(Floyd)算法。费洛伊德(Floyd)算法算法的基本思想是:假设求从顶点 vi到vj的最短路径。如果从vi到vj存在一条长度为arcsij的路径,该路径不一定是最短路径,还需要进行n次试探。首先考虑路径和是否存在

9、。如果存在,则比较 vi,v1,vj 的路径长度,取长度较短者为当前所求得的最短路径。该路径是中间顶点序号不大于1的最短路径。其次,考虑从vi到vj是否包含有顶点v2为中间顶点的路径,若没有,则说明从vi到vj的当前最短路径就是前一步求出的;若有,那么可分解为v2,vj,而这两条路径是前一次找到的中间顶点序号不大于1的最短路径,将这两条路径长度相加就得到路径的长度。将该长度与前一次中求出的从vi到vj的中间顶点序号不大于1的最短路径比较,取其长度较短者作为当前求得的从vi到vj的中间顶点序号不大于2的最短路径。依此类推,直到顶点vn加入当前从vi到vj的最短路径后,选出从vi到vj的中间顶点序

10、号不大于n的最短路径为止。由于图G中顶点序号不大于n,所以vi到vj的中间顶点序号不大于n的最短路径,已考虑了所有顶点作为中间顶点的可能性,因此,它就是vi到vj的最短路径。4.4 建立有向图的存储结构 void CreateMGraph(MGraph * G,int n,int e) int i,j,k,w; for(i=1;ivexsi=(char)i; for(j=1;jj+)arcsij=Maxint; printf(输入%d条边的i,j及w:n,e); for(k=1;k=e;k+) scanf(%d,%d,%d,&i,&j,&w);arcsij=w; 有向图建立完毕n);4.5迪杰

11、斯特拉算法void Dijkstra(MGraph *G,int v1,int n)int D2MVNum,P2MVNum;int v,i,w,min;enum boolean SMVNum;for(v=1;varcsv1v; if(D2vMaxint) P2v=v1; else P2v=0;D2v1=0;for(i=2;n; min=Maxint; for(w=1;ww+) if(!Sw&D2warcsvwarcsvw; P2w=v;printf(路径长度 路径n%5d,D2i);,i);v=P2i; while(v!=0)arcsij!=Maxint) Pij=j; Pij=0; Dij=

12、G-arcsij; if(Dik+DkjDij) Dij=Dik+Dkj; Pij=Pik;4.7 运行主控程序void main() MGraph *G; int m,n,e,v,w,k; int xz=1; G=(MGraph *)malloc(sizeof(MGraph);输入图中顶点个数和边数n,e:%d,%dn,&e); CreateMGraph(G,n,e); while (xz!*求城市间的最短路径*n1.求一个城市到所有城市的最短路径n printf(“2.求任意的两个城市之间的最短路径n 请选择:1 或 2,选择 0 退出:%dxz); if(xz=2) Floyd(G,n)

13、;输入起点和终点:v,w:v,& k=Pvw; if(k=0)顶点 %d 到 %d 无路径!,v,w);从顶点%d到%d的最短路径是:,v,w,v); while(k!=w) %d,k); k=Pkw;,w);路径长度:%dn,Dvw); else if(xz=1)求单源路径,输入源点 v :v); Dijkstra(G,v,n);结束求最短路径五、运行与测试:1、进入查询系统并设置城市个数及城市间连接情况2、进入查询界面,按要求“1”进行查询3、在查询界面,按要求“2”进行查询4、退出查询界面六、:总结与心得在第一次编译时出现了很多错误,是因为我对C语言的不熟练,比如调用费洛伊德算法时出现了

14、调用的错误,找了好久,才改正过来,还有就是for语句的运用,由于本次程序要用很多for循环,我把一次for循环放到了上面for循环中,导致程序不能正确输出结果。最后把调到外面才能运行。通过本实验基本掌握了这两个算法的应用,编程过程中有过很多失误,可知对平时的学习还有很多不够仔细的地方,通过这次设计,我学到了很多。 附录:程序代码#includestdlib.h#define Num 288 /定义常量Num#define Maxint 31111enum booleanFALSE,TRUE; /定义布尔类型typedef char VertexType;typedef int Adjmatri

15、x; VertexType vexsNum; /顶点数组, 类型假定为char型 Adjmatrix arcsNumNum; / 邻接矩阵, 假定为int型int D1Num,P1Num;int DNumNum,PNumNum;void CreateMGraph(MGraph *G,int n,int e); /采用邻接矩阵表示法构造有向图G,n,e表示图的当前顶点数和边数void Dijkstra(MGraph *G,int v1,int n); /狄克斯特拉算法的声明void Floyd(MGraph *G,int n); /弗洛伊德算法的声明 MGraph *G; system(colo

16、r 1f /定义无向图G int n,e,v,w,k; int m=1;*n* 欢迎使用交通查询系统 *n*=*n* PS:输入完文本后,均以Enter结束!*n*输入顶点和边数时请使用“,”号隔 *n*开! *n使用查询功能前,请输入顶点个数和边数n,e: /调用CreateMGraph有向图函数 while(m!=0)=n _ 求城市之间的最短路径 _ n=n1 : 求一个城市到其他所有城市的最短路径n2 : 求任意的两个城市之间的最短路径n1 或 2 ,选择 0 退出:m); if(m=2)请输入起点和终点,用“,”号隔开:n输出的结果:n顶点%d到%d无路径!n从顶点%d到%d的最短路

17、径是: %d=w)n 路径长度: %dn if(m=1)请输入起点编号:程序已结束!谢谢您的使用!void CreateMGraph(MGraph *G,int n,int e) /构建城市的无向图i+) /以任意城市i出发为起点i+) j+) /任意城市j为终点 /距离初始化 if(i=j)arcsij=0;n请输入%d条边的i,j,及w: n /建立城市之间的距离n地图的结构建立成功!void Dijkstra(MGraph *G,int v1,int n) /狄克斯特拉算法求一个城市到任意一个城市的距离 int D2Num,P2Num; int v,i,w,min; enum boolean SNum; for (v=1;v+) Sv=FALSE; /s置空 D2v=G-Maxint) / 路径初始化 P2v=v1; else P2v=0; P2v1=0; /源点V1放入s中 for(i=2;i+) /循环直至所有顶点的最都求出 min=Maxint; /Maxint置最小长度初值 for(w=1;w+) /选不在S中且有最小顶点w if(! v=w; Sv=TRUE; for(w=1;w+) /顶点w加入s中D2w) /修改不在s中的顶点的距离 D2w=D2v+G- P2w=v; printf(

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

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