校园导游咨询(最短路径)_第1页
校园导游咨询(最短路径)_第2页
校园导游咨询(最短路径)_第3页
校园导游咨询(最短路径)_第4页
校园导游咨询(最短路径)_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

校园导游咨询(最短路径)校园导游咨询(最短路径)校园导游咨询(最短路径)资料仅供参考文件编号:2022年4月校园导游咨询(最短路径)版本号:A修改号:1页次:1.0审核:批准:发布日期:数据结构课程设计实验报告学号:姓名:提交日期:成绩: 东北大学秦皇岛分校设计题目:校园导游咨询一、实验目的(1)熟练掌握图的创建及遍历基本操作算法。(2)熟练掌握最短路径算法。(3) 利用图的遍历和最短路径求解技术,设计一个校园导游程序,为来访的客人提供各种信息查询服务。二、需求分析实验内容【问题描述】设计一个校园导游程序,为来访的客人提供各种信息查询服务。【基本要求】设计你所在学校的校园平面图,所含景点不少于10个。以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。(2)为来访客人提供图中任意景点相关信息的查询。(3)为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。【测试数据】由读者根据实际情况指定。【实现提示】一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向网。顶点和边均含有相关信息。【实现功能】这个系统给用户提供查询景点,浏览路径,寻找最佳的方案到达目的地,还提供了最佳路径。概要设计1.系统分析:用的图的算法进行构造,用邻接表建立图,图的每一个顶点代表相应的景点。然后再用深度优先遍历进行搜索,查找所需的路径。再用迪杰特斯拉算法求出一个景点到其他景点之间的最佳路径。然后再用弗洛伊德算法求出要查询的出发点到目的地的最短路径。2.功能模块图;结束查看各景点游览路线结束查看各景点游览路线开始开始定义变量VVoidMenu()进入菜单Switch()选择功能退出系统浏览校园全景显示此图的邻接矩阵查看景点信息选择出发点和目的地退出系统浏览校园全景显示此图的邻接矩阵查看景点信息选择出发点和目的地(1)主菜单(Menu):存放着所有的选择供用户查询。用户可通过输入编号来查询自己想要获得的信息。(2)浏览校园全景(Browser):采用深度遍历遍历图进行所有景点浏览,将遍历景点信息输出。(3)查看各景点游览路线(ShortestPath_DIJ):用户输入一个景点,采用迪杰斯特拉算法将从该景点起所有路径查出并输出在屏幕上。(4)选择出发点和目的地(Floyd):用户输入一个出发点和一个目的地编号,采用弗洛伊德算法求出发点到目的地的最短路径。(5)查看景点信息(Search):直接输入编号进行单个景点查询。(6)显示图的邻接矩阵(print)(7)退出系统(exit)详细设计(1)图的结构typedefstructArCell//对弧的定义{intadj;//路径长度}ArCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];typedefstruct//图中顶点表示主要景点,存放景点的编号、名称、简介等信息,{charname[30];intnum;charintroduction[100];//简介}infotype;//数据域typedefstruct{infotypevexs[MAX_VERTEX_NUM];//顶点的数据域AdjMatrixarcs;//邻接矩阵intvexnum,arcnum;//图的当前顶点数和弧数}MGraph;各个函数的声明如下:voidcmd(void);MGraphInitGraph(void);//初始化图voidMenu(void);//整体菜单voidBrowser(MGraph*G);//遍历校园全景voidShortestPath_DIJ(MGraph*G);//景点所有路线voidFloyd(MGraph*G);//两景点之间最短距离voidSearch(MGraph*G);//查看景点信息voidprint(MGraph*G);//输出该图邻接矩阵主函数voidmain(void)//定义主函数{system("color1f");system("modecon:cols=100lines=40");cmd();//调用cmd()}主要函数<1>迪杰斯特拉算法算法思想:依路径长度递增的次序求得各条路径//迪杰斯特拉算法来计算出起点到各个顶点之间的最短路径,v0为起点voidShortestPath_DIJ(MGraph*G){intv,w,i,min,t=0,x,flag=1,v0;//flag=1保证输入编号有效intfinal[20],D[20],p[20][20];//用迪杰斯特拉算法求网G的v0顶点到其余顶点v的最短路径P[v]及带权长度D[v]//若P[v][w]为1,则w是从v0到v当前求得最短路径上的顶点//final[v]为1当且仅当v属于s(s是已求得最短路径的终点的集合),即已经求得从v0到v的最短路径while(flag){printf("请输入一个起始景点编号:");scanf("%d",&v0);//输入一个值赋给v0if(v0<0||v0>G->vexnum){printf("景点编号不存在!请重新输入景点编号:");scanf("%d",&v0);}if(v0>=0&&v0<G->vexnum)flag=0;}for(v=0;v<G->vexnum;v++){final[v]=0;//v不属于s,即v顶点还没有走过D[v]=G->arcs[v0][v].adj;//v0到v的弧权值for(w=0;w<G->vexnum;w++)p[v][w]=0;//设置空路径if(D[v]<INFINITY){p[v][v0]=1;p[v][v]=1;//v0是从v0到v的顶点,v是从v0到v的顶点}}D[v0]=0;final[v0]=1;//初始化,v0到v0的带权路径长度为0,最短路径,v0顶点属于s集//开始主循环,每次求得v0到某个v顶点的最短路径,并加v到s集for(i=1;i<G->vexnum;i++)//其余G.vexnum-1个顶点{min=INFINITY;//当前所知离v0顶点的最近距离for(w=0;w<G->vexnum;w++)if(!final[w])//w顶点在v-s中 if(D[w]<min){v=w;min=D[w];}//w顶点离v0顶点更近final[v]=1;//离v0顶点最近的v加入s集for(w=0;w<G->vexnum;w++)//更新当前的最短路径及距离if(!final[w]&&(min+G->arcs[v][w].adj<D[w]))//修改D[w]和P[w],w属于v-s{D[w]=min+G->arcs[v][w].adj;for(x=0;x<G->vexnum;x++)p[w][x]=p[v][x];p[w][w]=1;}}//用来更新到每一个顶点的最短路径for(v=0;v<G->vexnum;v++){if(v0!=v)printf("%s",G->vexs[v0].name);//输出字符串for(w=0;w<G->vexnum;w++){if(p[v][w]&&w!=v0)printf("-->%s",G->vexs[w].name);t++;}if(t>G->vexnum-1&&v0!=v)printf("总路线长%dm\n\n",D[v]);}}//ShortestPath_DIJend<2>Floyd算法算法思想:从vi到vj的所有存在的路径中,选出一条长度最短的路径,即每一对顶点之间的最短路径。voidFloyd(MGraph*G)//用Floyd算法求图中各对顶点v和w之间的最短路径P[v][w]及其//带权长度D[v][w]。若P[v][w][u]为1,则u是从v到w当前求得最短//路径上的顶点。{intv,u,i,w,k,j,flag=1,p[10][10][10],D[10][10];for(v=0;v<G->vexnum;v++)//各对结点之间初始已知路径及距离for(w=0;w<G->vexnum;w++){D[v][w]=G->arcs[v][w].adj;for(u=0;u<G->vexnum;u++)p[v][w][u]=0;if(D[v][w]<INFINITY){p[v][w][v]=1;p[v][w][w]=1;}}for(u=0;u<G->vexnum;u++)for(v=0;v<G->vexnum;v++)for(w=0;w<G->vexnum;w++)if(D[v][u]+D[u][w]<D[v][w])//从v经u到w的一条路径更短{D[v][w]=D[v][u]+D[u][w];//修改权值for(i=0;i<G->vexnum;i++)p[v][w][i]=p[v][u][i]||p[u][w][i];}while(flag){printf("请输入出发点和目的地的编号:");scanf("%d%d",&k,&j);if(k<0||k>G->vexnum||j<0||j>G->vexnum){printf("景点编号不存在!请重新输入出发点和目的地的编号:");scanf("%d%d",&k,&j);}if(k>=0&&k<G->vexnum&&j>=0&&j<G->vexnum)flag=0;}printf("%s",G->vexs[k].name);for(u=0;u<G->vexnum;u++)if(p[k][j][u]&&k!=u&&j!=u)printf("-->%s",G->vexs[u].name);printf("-->%s",G->vexs[j].name);printf("总路线长%dm\n",D[k][j]);}//Floydend测试结果程序界面:主界面:1.浏览校园全景查看各景点所有游览路线输入景点编号1:输入顶点编号3:3.选择出发点和目的地输入出发点和目的地的编号分别是:2和8输入出发点和目的地的编号分别是:1和94.查看景点信息查看景点信息:1查看景点信息4:显示此图的邻接矩阵6.退出系统调试与分析刚开始调试时出现很多错误,有些忘了写头文件,然后迅速从网上查到该词的头文件加在程序里。也有的函数忘记了提前声明导致了程序不能运行,以及其他各种问题。不过最后都能够通过各种途径调试出来,有查书的,也有向同学请教的。当程序能够正常运行出来时,界面显示也出现了很多问题。有的是因为少了换行符,导致界面排列不好。不过,最终都慢慢地改了过来。七、心得与体会经过两周的课程设计收获很多,在做课程设计之前,我觉得这是一项浩大的工程,总觉得自己会做不到。现在当我真的完成这个课程设计时,心里有一种成就感。这次课程设计,我学到了很多东西:学会了在编写几百行程序时如何查找错误,如何改错误;了解数据结构在编写比较复杂的程序的重要作用;对数据结构中定义无向图和创建无向图的理解更加深刻;最重要的是让我基本上明白了迪杰斯特拉算法和弗洛伊德算法。巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力。培养了我选用参考书,查阅手册及文献资料的能力。培养独立思考,深入研究,分析问题、解决问题的能力。通过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法和工程设计方法。够按要求编写课程设计报告书,能正确阐述设计和实验结果,正确绘制系统和程序框图。通过课程设计,培养了我严肃认真的工作作风,逐步建立正确的生产观念、经济观念和全局观念。同时,通过这次课程设计我发现,我的数据结构基础不够扎实,有很多地方还需要继续努力。课程设计是把我们所学的理论知识进行系统的总结并应用于实践的良好机会,有利于加强我们用知识理论来分析实际问题的能力,进而加强了我们对知识认识的实践度,巩固了我们的理论知识,深化了对知识的认识,并为走向社会打下一个良好的基础。在这次课程设计中我遇到许多问题和麻烦,得到了同学的帮助和指导,才能够使得这次课程设计顺利的进行下去,这也让我明白,要多于别人交流才能更好的完善自己。八、参考文献:《数据结构(C语言版》严蔚敏,吴伟民清华大学出版社附录该程序完整代码:#defineINFINITY10000/*无穷大*/#defineMAX_VERTEX_NUM40#defineMAX40#include<stdlib.h>//头文件#include<stdio.h>#include<conio.h>#include<string.h>typedefstructArCell//对弧的定义{intadj;//路径长度}ArCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//一个二维数组,数组里元素类型为整型typedefstruct//图中顶点表示主要景点,存放景点的编号、名称、简介等信息,{charname[30];intnum;charintroduction[100];//简介}infotype;//数据域typedefstruct{infotypevexs[MAX_VERTEX_NUM];//顶点的数据域AdjMatrixarcs;//邻接矩阵intvexnum,arcnum;//图的当前顶点数和弧数}MGraph;MGraphb;//全局变量voidcmd(void);MGraphInitGraph(void);voidMenu(void);voidBrowser(MGraph*G);voidShortestPath_DIJ(MGraph*G);voidFloyd(MGraph*G);voidSearch(MGraph*G);voidprint(MGraph*G);/******************************************************/voidmain(void)//定义主函数{system("color1f");system("modecon:cols=100lines=40");cmd();//调用cmd()}/******************************************************/voidcmd(void)//定义cmd(){inti;b=InitGraph();MGraphG;Menu();scanf("%d",&i);while(i!=6){switch(i){case1:system("cls");Browser(&b);Menu();break;//system("cls");作用是清屏case2:system("cls");ShortestPath_DIJ(&b);Menu();break;case3:system("cls");Floyd(&b);Menu();break;case4:system("cls");Search(&b);Menu();break;case5:system("cls");print(&b);Menu();break;case6:exit(1);break;default:break;//每次显示选择的一项后,会继续显示主菜单menu()}scanf("%d",&i);//输入的值d赋给i}}MGraphInitGraph(void)//初始化{MGraphG;inti,j;G.vexnum=10;//10个顶点G.arcnum=14;//14条弧for(i=0;i<G.vexnum;i++)G.vexs[i].num=i;//第i个景点的编号为istrcpy(G.vexs[0].name,"实验楼");//strcpy的头文件是string.hstrcpy(G.vexs[0].introduction,"实验器材齐全,承担各种建设项目,为学生提供有利的创新平台");strcpy(G.vexs[1].name,"图书馆");strcpy(G.vexs[1].introduction,"收藏丰富的图书,设施良好,有阅览室和电子阅览室,环境幽雅");strcpy(G.vexs[2].name,"网球场");strcpy(G.vexs[2].introduction,"网球课训练基地,为热爱网球的同学提供场地");strcpy(G.vexs[3].name,"经管楼");strcpy(G.vexs[3].introduction,"学校建校时所建,虽有点古老,但环境整洁,考研同学学习基地");strcpy(G.vexs[4].name,"旧操场");strcpy(G.vexs[4].introduction,"设有旧篮球场旧足球场,是晚自习后,同学们运动的最佳场所");strcpy(G.vexs[5].name,"二号学生宿舍");strcpy(G.vexs[5].introduction,"经贸学院及计算机与通信工程学院的女生宿舍,地理位置优越");strcpy(G.vexs[6].name,"第一学生餐厅");strcpy(G.vexs[6].introduction,"价格实惠,食物种类不多,各种饼的天下");strcpy(G.vexs[7].name,"工学馆");strcpy(G.vexs[7].introduction,"学院最大的教学楼,共8层,楼内冬暖夏凉,学生学习的最佳场所");strcpy(G.vexs[8].name,"第六学生公寓");strcpy(G.vexs[8].introduction,"新建的学生公寓,居住环境幽雅,设施良好,就餐方便");strcpy(G.vexs[9].name,"大学生会馆");strcpy(G.vexs[9].introduction,"设施良好,举办各种活动以及各种重要讲座的最佳基地");for(i=0;i<G.vexnum;i++)for(j=0;j<G.vexnum;j++)G.arcs[i][j].adj=INFINITY;G.arcs[0][1].adj=20;G.arcs[0][2].adj=100;G.arcs[1][3].adj=40;G.arcs[1][4].adj=150;G.arcs[2][4].adj=10;G.arcs[3][5].adj=200;G.arcs[4][5].adj=60;G.arcs[4][8].adj=80;G.arcs[5][6].adj=10;G.arcs[5][7].adj=60;G.arcs[6][7].adj=50;G.arcs[7][8].adj=240;G.arcs[7][9].adj=200;G.arcs[8][9].adj=300;for(i=0;i<G.vexnum;i++)for(j=0;j<G.vexnum;j++)G.arcs[j][i].adj=G.arcs[i][j].adj;//无向网returnG;}//InitGraphendvoidMenu()//定义主菜单{printf("\n东北大学秦皇岛分校导游图\n");printf("┏━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃1.浏览校园全景┃\n");printf("┃2.查看各景点所有游览路线┃\n");printf("┃3.选择出发点和目的地┃\n");printf("┃4.查看景点信息┃\n");printf("┃5.显示此图的邻接矩阵┃\n");printf("┃6.退出系统┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━┛\n");printf("Option-:");}voidBrowser(MGraph*G){intv;printf("┏━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃编号┃景点名称┃简介┃\n");for(v=0;v<G->vexnum;v++)printf("┃%-4d┃%-16s┃%-56s┃\n",G->vexs[v].num,G->vexs[v].name,G->vexs[v].introduction);printf("┗━━┻━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");}//迪杰斯特拉算法来计算出起点到各个顶点之间的最短路径,v0为起点voidShortestPath_DIJ(MGraph*G){intv,w,i,min,t=0,x,flag=1,v0;//flag=1保证输入编号有效intfinal[20],D[20],p[20][20];//用迪杰斯特拉算法求网G的v0顶点到其余顶点v的最短路径P[v]及带权长度D[v]//若P[v][w]为1,则w是从v0到v当前求得最短路径上的顶点//final[v]为1当且仅当v属于s(s是已求得最短路径的终点的集合),即已经求得从v0到v的最短路径while(flag){printf("请输入一个起始景点编号:");scanf("%d",&v0);//输入一个值赋给v0if(v0<0||v0>G->vexnum){printf("景点编号不存在!请重新输入景点编号:");scanf("%d",&v0);}if(v0>=0&&v0<G->vexnum)flag=0;}for(v=0;v<G->vexnum;v++){final[v]=0;//v不属于s,即v顶点还没有走过D[v]=G->arcs[v0][v].adj;//v0到v的弧权值for(w=0;w<G->vexnum;w++)p[v][w]=0;//设置空路径if(D[v]<INFINITY){p[v][v0]=1;p[v][v]=1;//v0是从v0到v的顶点,v是从v0到v的顶点}}D[v0]=0;final[v0]=1;//初始化,v0到v0的带权路径长度为0,最短路径,v0顶点属于s集//开始主循环,每次求得v0到某个v顶点的最短路径,并加v到s集for(i=1;i<G->vexnum;i++)//其余G.vexnum-1个顶点{min=INFINITY;//当前所知离v0顶点的最近距离for(w=0;w<G->vexnum;w++)if(!final[w])//w顶点在v-s中 if(D[w]<min){v=w;min=D[w];}//w顶点离v0顶点更近final[v]=1;//离v0顶点最近的v加入s集for(w=0;w<G->vexnum;w++)//更新当前的最短路径及距离if(!final[w]&&(min+G->arcs[v][w].adj<D[w]))//修改D[w]和P[w],w属于v-s{D[w]=min+G->arcs[v][w].adj;for(x=0;x<G->vexnum;x++)p[w][x]=p[v][x];p[w][w]=1;}}//用来更新到每一个顶点的最短路径for(v=0;v<G->vexnum;v++){if(v0!=v)printf("%s",G->vexs[v0].name);//输出字符串for(w=0;w<G->vexnum;w++){if(p[v][w]&&w!=v0)printf("-->%s",G->vexs[w].name);t++;}if(t>G->vexnum-1&&v0!=v)printf("总路线长%dm\n\n",D[v]);}}//ShortestPath_DIJendvoidFloyd(MGraph*G)//用Floyd算法求图中各对顶点v和w之间的最短路径P[v][w]及其//带权长度D[v][w]。若P[v][w][u]为1,则u是从v到w当前求得最短//路径上的顶点。{intv,u,i,w,k,j,flag=1,p[10][10][10],D[10][10];for(v=0;v<G->vexnum;v++)//各对结点之间初始已知路径及距离for(w=0;w<G->vexnum;w++){D[v][w]=G->arcs[v][w].adj;for(u=0;u<G->vexnum;u++)p[v][w][u]=0;if(D[v][w]<INFINITY){p[v][w][v]=1;p[v][w][w]=1;}}for(u=0;u<G->vexnum;u++)for(v=0;v<G->vexnum;v++)for(w=0;w<G->vexnum;w++)if(D[v][u]+D[u][w]<D[v][w])//从v经u到w的一条路径更短

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论