1 概述 ............................................................................................... 2 1.1 课程设计名称 .............................................................................. 2 1.2 课程设计目的 .............................................................................. 2 2 系统分析 ........................................................................................ 2 2.1 问题描述 ................................................................................ 2 2.2 设计要求 ................................................................................ 2 2.3 课程设计内容 ......................................................................... 2 3 概要设计 ........................................................................................ 2 3.1 定义相关的数据类型 .............................................................. 2 3.2 总体结构图 ............................................................................ 3 图5.1 ........................................................................................... 3 3.3 模块调用图 ............................................................................ 3 图5.2 ................................................................................................ 4 4 详细设计 ........................................................................................ 4 4.1建立一个有向图的存储结构 .......................................................... 4 4.2 迪杰斯特拉算法 ..................................................................... 4 4.3 费洛伊德算法 ......................................................................... 4 4.4 主函数流程图 .............................................................................. 4 5运行与测试 ..................................................................................... 6 实例的运行数据 ................................................................................. 6 图5.4 ........................................................................................... 6 5.1 有向图的存储结构建立 ........................................................... 6 5.2 单源最短路径 ......................................................................... 7 5.3 任意一对顶点间最短路径 ....................................................... 7 6 总结与心得 .................................................................................... 8 7 参考文献 ........................................................................................ 8 8 附录(程序源代码) ...................................................................... 8
1 概述
1.1 课程设计名称
交通咨询系统设计(最短路径问题) 1.2 课程设计目的
充分了解并掌握最短路径问题及其应用,根据有向图的存储结构解决实际问题。
2 系统分析
2.1 问题描述
对于该设计,可用一个图结构来表示交通网络系统,利用计算机建立一个交通咨询系统。图中顶点表示城市,边表示城市之间的交通关系。这个交通系统可以回答
2.2 设计要求
1、建立交通网络的存储结构
2、提供一个城市到任意城市最短路径查询功能 3、提供任意两个城市间最短路径查询功能 4、提供程序测试算法 5、界面友好
2.3 课程设计内容
设计一个交通咨询系统,能让旅客咨询从任一个城市定点到另一个城市定点之间的最短路径或最低花费或最少时间等问题。对于不同的咨询要求、可输入城市间的路程或所需时间或所需花费。
3 概要设计
3.1 定义相关的数据类型
采用邻接矩阵定义图: typedef struct{
VertexType vexs[MVNum];//顶点数组类型假定为char型 Adjmatrix arcs[MVNum][MVNum];//邻接矩阵假定为int型 }MGraph; 建立图的存储结构
#include #define MVNum 100//最大顶点数 #define Maxint 32767 enum boolean{FALSE,TRUE}; typedef char VertexType; typedef int Adjmatrix; typedef struct{ VertexType vexs[MVNum];//顶点数组类型假定为char型 Adjmatrix arcs[MVNum][MVNum];//邻接矩阵假定为int型 }MGraph; //MGraph是以邻接矩阵存储的图类型 3.2 总体结构图 交通咨询管理系统 建立有向图的存储结构 单源 路径 查询 问题 图5.1 3.3 模块调用图 主函数 main 任意 一对 顶点 间最 短路 径 调用迪杰斯特算法void dijkstra 创建有向图 void MGraph 调用费洛伊德算法void Floyd 打印系统菜单 图5.2 4 详细设计 4.1建立一个有向图的存储结构 有向图的邻接矩阵是不对称的,实现其算法,我们只需要输入有向图的有向边及权值即可。采用邻接矩阵表示法构造有向图G,输入图中顶点个数和边数,初始化邻接矩阵,紧跟着系统提示输入边及权值,则系统提示有向图的存储结构建立完毕。 4.2 迪杰斯特拉算法 为了解决单源路径问题,我们提出了迪杰斯特拉算法,它主要是按路径长度递增产生顶点的 最短路径算法,其实现如下: 初始化S和D,置空最短路径终点集,置初始的最短路径值; S[v1]=TRUE;D[v1]=0;//S集初始时只有源点,源点到源点的距离为0; While(S集中顶点数 更新当前最短路径及距离; } 4.3 费洛伊德算法 任意一对顶点间最短路径,假设求从顶点vi到vj的最短路径。如果从vi到vj存在一条长度为arcs[i][j]的路径,该路径不一定是最短路径,还需要进行n次试探。首先考虑路径〈vi,v1〉和〈v1,vj〉是否存在。如果存在,则比较路径〈vi,vj〉和〈vi,v1,vj〉的路径长度,取长度较短者为当前所求得的最短路径。该路径是中间顶点序号不大于1的最短路径。其次,考虑从vi到vj是否包含有顶点v2为中间顶点的路径〈vi,…,v2,…,vj〉,若没有,则说明从vi到vj的当前最短路径就是前一步求出的;若有,那么〈vi,…,v2,…,vj〉可分解为〈vi,…,v2〉和〈v2,…,vj〉,而这两条路径是前一次找到的中间点序号不大于1的最短路径,将这两条路径长度相加就得到路径〈vi,…,v2,…,vj〉的长度。将该长度与前一次中求出的从vi到vj的中间顶点序号不大于2的最短路径。依次类推,直至顶点vn加入当前从vi到vj的最短路径后,选出从vi到vj的中间顶点序号不大于n的最短路径为止。由于图G中顶点序号不大于n,所以vi到vj的中间顶点序号不大于n的最短路径,已考虑了所有顶点作为中间顶点的可能性,因此,它就是vi到vj的最短路径。 4.4 主函数流程图 开始 建立图的存储结构 输入任一个城市顶点 功能 选择 0 1 2 调用费洛伊 调用迪杰斯德算法 特算法 运行 输出结果 退出 结束 图5.3 5运行与测试 实例的运行数据 a g f c b e d 图5.4 5.1 有向图的存储结构建立 5.2 单源最短路径 5.3 任意一对顶点间最短路径 顶点4到7无路径: 5.4 退出系统 6 总结与心得 在本次实验过程中,输入错误还是存在的问题,书上代码还是有错误的,但能很快的通过编译解决,一些编译不能发现的问题,我们在组建过程中也能发现并解决。在组建过程中,总是显示连接错误,经过检查,程序代码没有错误。初步以为是系统在建立文件时的错误,经过从新建立一次文件,此错误解除了,原来是因为有其他程序在执行。 在该程序中,有向图的邻接矩阵是不对称的,实现其算法,我们只需要输入有向图的有向边及权值即可。 总的来说,这次课程设计还是学到了一些东西,经过我们不断的实验,找到了错误答案,学到了很多东西,所以在编程中和调试中要养成认真分析的善于发现问题并及时解决的习惯,不懂的及时问老师或其他同学。通过本次实验,让我们对图的基本结构有了更好的认识,有效的解决了最短路径问题,对两个算法的使用有了更好的掌握。 7 参考文献 1)徐孝凯,魏荣《数据结构》,机械工程出版社 2) 谭浩强《程序设计》,北京大学出版社 3) 杨路明《C语言程序设计教程》,北京邮电大学出版社. 4) 耿国华《数据结构-C语言描述》,高等教育出版社 8 附录(程序源代码) #include #define MVNum 100 //最大顶点数 #define Maxint 32767 enum boolean{ FALSE,TRUE }; typedef char VertexType; typedef int Adjmatrix; typedef struct { VertexType vexs[MVNum]; //顶点数组,类型假定为char型 Adjmatrix arcs[MVNum][MVNum]; //邻接矩阵,假定为int型 }MGraph; int D1[MVNum],P1[MVNum]; int D[MVNum][MVNum],P[MVNum][MVNum]; void CreateMGraph(MGraph *G,int n,int e) { //采用邻接矩阵表示法构造有向图G,n,e表示图的当前顶点数和边数 int i,j,k,w; for(i=1;i<=n;i++) //输入顶点信息 G->vexs[i]=(char)i; for(i=1;i<=n;i++) for(j=1;j<=n;j++) G->arcs[i][j]=Maxint; //初始化邻接矩阵 printf(\"输入%d条边的i,j以及w:\\n\ for(k=1;k<=e;k++) { //读入e条边,建立邻接矩阵 scanf(\"%d,%d,%d\ G->arcs[i][j]=w; } printf(\"有向图的存储结构建立完毕!\\n\"); } void Dijkstra(MGraph *G,int v1,int n) { //用Dijkstra算法求有向图G的v1顶点到其他顶点v的最短路径P[v]及其权D[v] //设G是有向图的邻接矩阵,若边不存在,则G[i][j]=Maxint //S[v]为真当且仅当v属于s,即已求得从v1到v得最短路径 int D2[MVNum],P2[MVNum]; int v,i,w,min; enum boolean S[MVNum]; for(v=1;v<=n;v++) { //初始化S和D S[v]=FALSE; //置空最短路径终点集 D2[v]=G->arcs[v1][v]; //置初始的最短路径值 if(D2[v] void Floyd(MGraph *G,int n) { int i,j,k,v,w; for(i=1;i<=n;i++) for(j=1;j<=n;j++) { if(G->arcs[i][j]!=Maxint) P[i][j]=j; else P[i][j]=0; D[i][j]=G->arcs[i][j]; } for(k=1;k<=n;k++) { for(i=1;i<=n;i++) for(j=1;j<=n;j++) { if(D[i][k]+D[k][j] G=(MGraph *)malloc(sizeof(MGraph)); printf(\"输入图中顶点个数和边数n,e: \"); scanf(\"%d,%d\CreateMGraph(G,n,e); while(xz!=0) { printf(\"*****求城市之间的最短路径*****\\n\"); printf(\"==============================\\n\"); printf(\"1.求一个城市到所有城市的最短路径\\n\"); printf(\"2.求任意的两个城市之间的最短路径\\n\"); printf(\"==============================\\n\"); printf(\" 请选择:1 或 2,选择0 退出 :\"); scanf(\"%d\ if(xz==2) { Floyd(G,n); printf(\"输入原点(或称起点)和终点 :v,w:\"); scanf(\"%d,%d\ k=P[v][w]; if(k==0) printf(\"顶点%d到%d 无路径! \\n\ else { printf(\"从顶点%d到%d的最短路径是: %d\ while(k!=w) { printf(\"->%d\ k=P[k][w]; } printf(\"->%d\ printf(\"路径长度: %d\\n\ } } else if(xz==1) { printf(\"求单源路径,输入源点v:\"); scanf(\"%d\ Dijkstra(G,v,n); } } printf(\"结束求最短路径,再见!\\n\"); } 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务