数据结构与算法课程设计城市公共交通最短线路.docx
- 文档编号:8132622
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:11
- 大小:55.69KB
数据结构与算法课程设计城市公共交通最短线路.docx
《数据结构与算法课程设计城市公共交通最短线路.docx》由会员分享,可在线阅读,更多相关《数据结构与算法课程设计城市公共交通最短线路.docx(11页珍藏版)》请在冰豆网上搜索。
数据结构与算法课程设计城市公共交通最短线路
数据结构与算法
课程设计
一、问题描述及设计目的
城市公共交通最短线路,利用邻接矩阵来构建交通节点,邻接矩阵的行列编号即为交通中的节点,有行列决定的数据即为权值基本的输入信息和条件:
1.输入总的节点个数,即为交通中的站点数目
本程序中,站点的数目最大值为100。
2.输入存在的通路,即为弧两个站点之间是联通的
弧的数目是有限制的,数目小于站点数目[n*(n-1)]/2
3.输入存在通路的两点,即为两站点
站点编号要小于站点总数目
二、应具备的功能
1.确定起点的最短路径问题,即已知起始结点,求最短路径的问题。
2.确定终点的最短路径问题,与确定起点的问题相反,该问题是已知终结结点,求最短路径的问题。
在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题。
3.确定起点终点的最短路径问题,即已知起点和终点,求两结点之间的最短路径。
三、设计思想、主要算法的实现、基本操作、子程序调用关系
1.Dijkstra算法的基本思想
按路径长度递增顺序求最短路径算法。
2.Dijkstra算法的基本步骤
设V。
是起始源点,S是已求得最短路径的终点集合。
V-S=未确定最短路径的顶点的集合,初始时S={V0},长度最短的路
径是边数为1且权值最小的路径。
下一条长度最短的路径:
①Vi•V-S,先求出Vo到Vi中间只经S中顶点的最短路径;
②上述路径中长度最小者即为下一条长度最短的路径;
②将所求最短路径的终点加入S中;
重复直到求出所有终点的最短路径。
3.存储结构设计
本系统采用图结构类型(mgraph)存储抽象交通图的信息。
其中:
各站点间的邻接关系用图的邻接矩阵类型存储;图的顶点个数及边的个数由分量n、e表示,它们是整型数据。
数据结构如下:
intno;
typedefstruct
//顶点编号
的权值
查询站点间的最短路程距离和路径
该功能是查询站点的最短路径,包括距离和线路,有Floyd()函数
实现。
输出邻接矩阵
该功能即输出图的邻接矩阵的值,由函数DispMat(g)实现
4.算法设计
分析实现功能的几个主要函数的代码构成和实现方式
(1).输出邻接矩阵
通过循环嵌套,即双重循环,打印矩阵数据
时间复杂度由站点数n确定T=O(n^2)
voidDispMat(MGraphg)//输出邻接矩阵g
{
inti,j;
for(i=0;i { for(j=O;j if©edges[i][j]==INF) printf("%3s","乂");//表示两站点间不可达 else printf("%3d",g.edges[i][j]); printf("\n"); (2).求最短路线 通过自递归,逐个输出最短路径所经过的站点编号 Ppath()函数在path中递归输出从站点i到站点j的最短路径 voidppath(intpath[][MAXV],inti,intj)//输入各条最短路 经 { intk; k=path[i][j]; if(k==-1)return; ppath(path,i,k);//递归 printf("%3d,",k);//输出站点编号 ppath(path,k,j); } (3).求最短路线的距离 Path二维数组保存最短路径,它与当前的迭代的次数有关。 求A[i][j]时,path[i][j]存放从顶点i到j的中间编号大于k的最 短路径上前一个结点的编号。 在算法结束时,有二维数组path的值追 溯,可以得到从i到j的最短路径,若path[i][j]=-1.则没有中间站 点。 voidFloyd(MGraphg)//弗洛伊德算法从每对顶点 之间的最短路径 { intA[MAXV][MAXV],path[MAXV][MAXV]; inti,j,k,f,r,n=g.n; for(i=0;i for(j=0;j { A[i][j]=g.edges[i][j]; path[i][j]=-1; } for(k=0;k { for(i=0;i for(j=0;j if(A[i][j]>(A[i][k]+A[k][j])) A[i][j]=A[i][k]+A[k][j]; path[i][j]=k; } } printf("\n输出需要查找的两个站点: \n"); printf("起点: ");scanf("%3d",&f); while(f>二n) { printf("该点不存在,请重新输入! \n"); printf("起点: ");scanf("%3d",&f); }; printf("终点: ");scanf("%3d",&r); while(r>=n){ printf("该点不存在,请重新输入! \n"); printf("终点: ");scanf("%3d",&r); }; while(r==f){ printf("不能等于起点,请重新输入! \n”); printf("终点: ");scanf("%3d",&r); }; printf("\n输出最短路径: \n"); if(A[f][r]==INF){if(f! =r)printf("从%3d到%3d没有路径 \n",f,r);} else { printf("从%3d到%3d路径为: ",f,r); printf("%3d,",f); ppath(path,f,r); printf("%3d",r); printf("\t路径长度为: %3d\n",A[f][r]); } } 四、环境和工具、用户手册 1.环境与工具 VC++6.0 2•用户手册 本程序只能对程序原有的结点进行输入查找最短距离等基础功能, 不能用于对其它的邻接矩阵的查找操作。 五、详细设计(源程序清单) #inelude #defineMAXV100 〃最大顶点个数 #defineINF32767 //用32767表示乂 typedefintInfoType; //假设InfoType为int类型 //以下定义邻接矩阵类型 typedefstruct {intno; //顶点编号 InfoTypeinfo; //顶点其他信息,这里用于存放边的权值 }VertexType; //顶点类型 typedefstruct 〃图的定义 {intedges[MAXV][MAXV];//邻接矩阵 intn,e; //顶点数,弧数 VertexTypevexs[MAXV];//存放顶点信息 }MGraph; 〃图的邻接矩阵类型 voidDispMat(MGraphg) 〃输出邻接矩阵g {inti,j; for(i=0;i<14;i++) {for(j=0;j<14;j++) if©edges[i][j]==INF) printf("%3s","oo"); else printf("%3d",g.edges[i][j]); printf("\n");}} voidppath(intpath[][MAXV],inti,intj)//输入各条最短路经 {intk; k=path[i][j]; if(k==-1)return; ppath(path,i,k); printf("%3d,",k); ppath(path,k,j);} voidFloyd(MGraphg)//弗洛伊德算法从每对顶点之间的最短路径 {intA[MAXV][MAXV],path[MAXV][MAXV]; inti,j,k,f,r,n=14; for(i=0;i for(j=0;j {A[i][j]=g.edges[i][j]; path[i][j]=-1;} //计算Ak for(k=O;k {for(i=0;i for(j=0;j if(A[i][j]>(A[i][k]+A[k][j])) {A[i][j]=A[i][k]+A[k][j]; path[i][j]=k;}} printf("\n输出需要查找的两个站点(站点编号为0-13): \n"); printf("起点: ");scanf("%3d",&f); while(f>二n) {printf(”该点不存在,请重新输入! \n"); printf("起点: ");scanf("%3d",&f);}; printf("终点: ");scanf("%3d",&r); while(r>=n){ printf("该点不存在,请重新输入! \n"); printf("终点: ");scanf("%3d",&r);}; while(r==f){ printf("不能等于起点,请重新输入! \n"); printf("终点: ");scanf("%3d",&r);}; printf("\n输出最短路径: \n"); if(A[f][r]==INF){if(f! 二r)printf("从%3d到%3d没有路径\n",f,r);} else {printf("从%3d到%3d路径为: ",f,r); printf("%3d,",f); ppath(path,f,r); printf("%3d",r); printf("\t路径长度为: %3d\n",A[f][r]);}} voidmain() {printf("交通网路的邻接矩阵为\n"); inti,j; MGraphg; int A[14][14]={{32767,32767,32767,32767,32767,32767,32767,8,32767,32767, 32767,32767,32767,32767},{32767,32767,32767,32767,32767,32767,32767 6,32767,8,32767,32767,32767,32767},{32767,32767,32767,32767,32767,3 2767,32767,32767,32767,7,32767,32767,32767,32767},{32767,32767,3276 7,32767,32767,32767,32767,32767,5,32767,7,32767,32767,32767},{32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,6,32767,32767, 9},{32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,327 67,6,32767,8},{32767,32767,32767,32767,32767,32767,32767,32767,32767 32767,32767,32767,6,32767},{32767,6,32767,32767,32767,32767,32767,3 2767,32767,32767,32767,32767,32767,32767},{8,32767,32767,5,32767,327 67,32767,32767,32767,32767,32767,32767,32767,32767},{32767,8,7,32767 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767},{3276 7,32767,32767,7,6,32767,32767,32767,32767,32767,32767,32767,32767,32 767},{32767,32767,32767,32767,32767,6,32767,32767,32767,32767,32767, 32767,1,32767},{32767,32767,32767,32767,32767,32767,6,32767,32767,32 767,32767,1,32767,32767},{32767,32767,32767,32767,9,8,32767,32767,32 767,32767,32767,32767,32767,32767}}; for(i=0;i<14;i++) for(j=0;j<14;j++) g.edges[i][j]=A[i][j]; DispMat(g); Floyd(g);} 六、结果分析及算法评价 程序主界面及输入起点: 输入起点终点输出最短路径: 』"D\vc60\MSDev9B\MyProject$\Sdf\Debug\safnexe"— 屮巨*x ■■■I 交通网路的邻接矩阵为 Q CO g g CO g g S g co g oo co- OO oo oo OD oo oo co 6 oo a CSC OG oo oo oo co OD oo 0O co CO oo ? cx> OO oo- oo co g 8 oo co oo 8 5 oo ? oo 8 8 co oo OO oo oo oo □O 8 oo & oo OO 9 g eo g oo g co CO CO g g 6 g a co CO OO co CO co CO oo co CO 6 oo 1oo 6 OQ oo oo co DO oo oo oo oo OO oo s oo 5 oo oo oo OO OQ- OQ oo oo oc- oo co 8 8 oo oo co CO 8 8 co g oo 8 co co 7 6 oo g oo g 8 g oo oo OO co co g oo G co g €O OO g g 1 OO oo oo oo co oo OD cs? 1 oo OO g co OQ 9 8 CO oo oo OO oo co oo oo 输出需要查找的两个站点(站点编号为42);起点;3 输出最短路径: 地3到嚼径为 3, 8, 0, 7, 1 ‘9 路径长度为: 詰 Pressanu key 1to continue- 'V 总结分析 此次算法的编辑过程,使我熟练的掌握了邻接矩阵存储结构的使用,从另一面了解到迪克斯拉算法,更深刻的意识到清晰的思路能够使程序简单明了。 经过多次的调试与编译,最终程序的运行结果达到自己的要求。 通过课程设计的练习,强化自己对所学知识的掌握及对问题分析和任务定义的理解,对每到题目作出了相应的逻辑分析和数据结构的选择,通过对任务的分析,为操作对象定义相应的数据结构,以过程化程序设计的思想方法为原则划分各个模块,定义数据的抽象数据类型。 通过程序的编译掌握对程序的调试方法及思想,并且让自己学会使用一些编程技巧。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 算法 课程设计 城市 公共交通 线路