交通网中的最短路径.docx
- 文档编号:28722124
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:26
- 大小:261.83KB
交通网中的最短路径.docx
《交通网中的最短路径.docx》由会员分享,可在线阅读,更多相关《交通网中的最短路径.docx(26页珍藏版)》请在冰豆网上搜索。
交通网中的最短路径
哈尔滨理工大学
课 程 设 计
(数据结构)
题 目:
交通网中的最短路径
班 级:
姓 名:
指导教师:
系主任:
2013年03月08日
目录
1(自己的课程设计题目)问题课程设计1
1.1题目分析1
1.2数据结构1
1.3流程图1
1.4实现技术2
1.5设计结论和心得2
2(使用的程序语言,例如C或C++)代码分析3
2.1功能说明3
2.2局部数据结构3
2.3流程图3
2.4以实例说明运行过程4
1交通网中的最短路径
1.1题目分析
交通图中最短路径系统的开发工具采用VisualC++6.0,主要功能是对城市名及城市间的距离进行输入,显示,计算单源最短路径,任意两点间最短路径及保存,退出系统等功能。
系统给用户提供一个简单的人机界面,使用用户可以根据提示输入操作项,对应用函数完成系统提供的管理功能。
主要需求分析如下:
(1)系统主控平台允许用户选择想要进行的操作,包括建立一个城市交通图、计算单源最短路径、计算任意两点最短路径、保存城市及城市间最短路径、有关该系统介绍、退出系统等。
(2)建立一个城市交通图用户根据提示选择系统自带数据或亲自输入演示,选择
(1)是系统中自带的一些路径信息,选择
(2)即需要用户亲自输入一些数据信息,为了演示方便需要系统内部自带一些数据,即文件的读入功能。
(3)计算单元最短路径在建立城市交通图的基础上,选择了该选项后,输入源城市,计算该城市到其他城市的最短路径。
(4)计算任意两点间最短路径在建立了城市交通图的基础上,选择了该选项后,用户输入任意两城市的序号,计算两点间的最短路径。
(5)保存城市及城市间最短路径用户在选择了该选项后,系统会自动保存之前单源最短路径。
(6)有关该系统介绍用户在选择了该选项后,系统自动读取保存的系统简介,方便用户是由该系统。
(7)退出系统用户选择了之后自动退出该系统。
…
1.2功能简介
(1)制作本系统目的在于实现djisitla和floyd算法,即单源最短路径及任意两点之间的最短路径。
(2)本系统最多允许输入100个城市100条路径
(3)使用本系统时首先应先选择
(1)输入您想计算的顶点(城市)及顶点(城市)间的路径长度
(4)输入完成后系统自动生成一个城市交通邻接矩阵
(5)选择
(2)计算单源城市最短路径系统自动调用djisitla算法函数,输出单源到其他城市的最短路径
(6)选择(3)计算任意两城市间最短路径输入您想知道的任意两城市,系统自动输出该长度
(7)选择(4)保存最短路径,将djisitla算法得出的最短路径保存,在
(1)选项的子菜单中选择系统自带数据即可查看
(8)选择(5)即可查看帮助文档,或是查询中国铁路(以北京为中心)的路径基本信息
(9)选择(6)退出该系统
1.3流程图
1.4运行环境(软、硬件环境)
1)硬件:
PC机
2)操作系统:
Windows2000/XP/2003
3)编译环境:
VisualC++6.0
1.5开发工具和编程语言
1.开发工具:
VISCALLC++6.0
2.编程语言:
C++语言
1.6详细设计(具体代码和测试数据见附录)
1.建立一个城市交通图(voidCreatG(intn,inte)函数)
该功能是利用邻接矩阵的方法建立的[1],在main()函数中调用CreatG()函数,提示用户输入点及边的信息,自动生成一个邻接矩阵并显示。
显示“按任意键继续……”字样。
2.计算最短路径(voiddijkstra()函数)
该功能是利用邻接矩阵计算单源城市最短路径详细算法见参考文献一,main()调用dijkstra(),生成单源最短路径,提示“按任意键继续……”字样。
3.计算任意两点最短路径(voidfloyd()函数)
该功能是利用邻接矩阵计算单源城市最短路径详细算法见参考文献一,main()调用dijkstra(),生成单源最短路径,提示“是否想知道其他两城市间最短路径”字样。
4.保存最短路径(voidsave())
首先提示用户输入要保存的文件名。
输入后系统将单源城市最短路径保存在指定文件下,提示“保存成功!
按任意键继续……”字样。
5.有关系统介绍提示用户该系统的操作详情。
6.退出系统选择(6)结束do-while循环。
1.7调试分析
在调试过程中出现的一些问题:
(1)在用AdjMGraph:
:
AdjMGraph()函数对变量进行初始化时,循环语句和选择语句的位置没掌握好,导致初始化失败。
(2)亲自写了一个析构函数但效果不好,于是便用系统自动生成的析构函数。
(3)AdjMGraph:
:
display()函数的设计没有达到预想的要求,想用这个函数输出单源最短路径。
但是由于输出关系没有设计的很好,所以只能实行源城市编号为一的情况,当源城市编号不为一是会输出路径和一些乱码。
这个问题最终没有的得到很好的解决。
(4)在.exe可执行文件中,出现输出结果滞留时间短不可控等现象。
最后用两个getchar()语句解决,实现“按任意键继续……”功能
(5)源代码用的是C++语言实现,所以在文件读取过程中,应该用C++流读取,但对流读取的知识掌握有限。
就采用了C语言中的文件读取方式
(6)该程序在功能选择上对输入的容错性不很好,还有待改进。
二.测试结果
(1)系统主控平台
(2)输出邻接矩阵
(3)计算单源最短路径
(4)计算任意两点间最短距离
(5)保存最短路径
(6)演示帮助文档
2.1参考文献
[1]严蔚敏,吴伟民·数据结构(C语言版)北京:
清华大学出版社,1997,4
[2]谭浩强,C程序设计题解与上机指导(第3版),清华大学出版社,2005.7.
[3]郑莉,董渊,张瑞丰·C++程序设计清华大学出版社,2003,12
课程设计总结
通过本次课程设计,增强了查阅相关参考资料的能力;独立分析解决问题的能力;创新精神及自己的上机动手的能力;平时的学习都是在书本上得来的,很少有时间的机会。
纸上得来终觉浅,即使平时学校的再多也只是理论层面上的,通过本次课程设计的学习,我发现实践与理论的差距还是很大的。
想写好一个优秀的程序是很困难的,计算机程序设计是以理论依托实践,对我们平时所欠缺的上机实现自己所学的理论既是一个挑战也是一次很好的学习机会。
通过本次课程设计我学到了很多也发现了自身的很多缺点,以及理论上的不足和事见上的欠缺。
对我以后的学习方向也起到了一个指导性的作用。
附录:
程序源代码:
头文件(.h)
#include
#include
#include
#include
usingnamespacestd;
constintMaxV=100;
constintMaxW=32767;
classAdjMGraph
{
private:
charVertices[MaxV][MaxV];
intcost[MaxV][MaxV],dist1[MaxV][MaxV];
intnumV,numE,v0;
intdist[MaxV],pre[MaxV],path[MaxV][MaxV];
public:
AdjMGraph();
~AdjMGraph(){};
voidCreatG(intn,inte);
voidPrintOut();
voiddijkstra();
voidFloyd();
voiddisplay();
voidsave();
};
AdjMGraph:
:
AdjMGraph()
{
for(inti=0;i { dist[i]=0;pre[i]=0; } for(inti=0;i for(intj=0;j { if(i==j) cost[i][j]=0; else cost[i][j]=MaxW; } numE=0; numV=0; } voidAdjMGraph: : CreatG(intn,inte) { intvi,vj,w; charo; numE=e; numV=n; cout<<"\n输入顶点的信息(城市名称): \n"; cout<<"1.系统自带\n"; cout<<"2.亲自体验\n"; getchar(); if(o=getchar()=='1') { system("cls"); cout<<"您选择了系统自带数据\n"; FILE*fp; fp=fopen("chengshi.txt","r"); for(inti=0;i { fscanf(fp,"%s",Vertices[i]); } fclose(fp); } else { cout<<"\n您选择了亲自体验,请注意与总点数(城市个数n)总边数(城市间交通路线数e)相匹配! \n"; cout<<"所以请输入顶点的信息(城市名称): \n"; for(inti=0;i { cout<<"\n"< "; cin>>Vertices[i]; } } cout<<"\n输入边的信息(vi,vj,w): \n"; cout<<"1.系统自带\n"; cout<<"2.亲自体验\n"; getchar(); if(o=getchar()=='1') { system("cls"); cout<<"您选择了系统自带数据\n"; FILE*fp; fp=fopen("quanzhi.txt","r"); for(inti=0;i { fscanf(fp,"%d%d%d",&vi,&vj,&w); cost[vi-1][vj-1]=w; cost[vj-1][vi-1]=w; } fclose(fp); } else { cout<<"\n您选择了亲自体验,输入边的信息(vi,vj,w): "; for(inti=0;i { cout< cin>>vi>>vj>>w; cost[vi-1][vj-1]=w; cost[vj-1][vi-1]=w; } } } voidAdjMGraph: : PrintOut() { cout<<"\n顶点的信息(城市名称): \n"; for(inti=0;i cout< cout<<"\n\n城市交通路线图邻接矩阵: "; for(inti=0;i { cout<<"\n"< for(intj=0;j cout< cout< } } voidAdjMGraph: : dijkstra() { inti,u,v,min,j; ints[MaxV]; cout<<"\n输入源点城市序号: "; cin>>v0; v0--; for(i=0;i { dist[i]=cost[v0][i]; if(i! =v0&&dist[i] pre[i]=v0; else pre[i]=-1; s[i]=0; } s[v0]=1;dist[v0]=0; for(i=0;i { min=MaxW; u=0; for(v=0;v if(s[v]==0&&dist[v] { min=dist[v]; u=v; } s[u]=1; for(j=0;j<=numV;j++) if(s[j]==0&&dist[u]+cost[u][j] { dist[j]=dist[u]+cost[u][j]; pre[j]=u; } } } voidAdjMGraph: : Floyd() { inti,j,k,o,p,u; for(i=0;i for(j=0;j dist1[i][j]=cost[i][j]; for(k=0;k for(i=0;i for(j=0;j if(dist1[i][k]+dist1[k][j] { dist1[i][j]=dist1[i][k]+dist1[k][j]; } cout< cin>>o>>p; cout<<"您想知道"<<"("< cout<<"的最短交通路线距离为: "; cout< } voidAdjMGraph: : display() { intv,k; for(v=0;v { if(v! =0) { k=v; cout<<"\n最短路径长度: "< cout< ("< do { cout< k=pre[k]; cout< }while(k! =0); cout< } } } voidAdjMGraph: : save() { FILE*fp; charfile[100]; intv,k; cout<<"请输入文件名: \n"; cin>>file; fp=fopen(file,"w"); for(v=0;v { if(v! =0) { k=v; fprintf(fp,"\n最短路径为: %d(%d)",dist[v],v+1); do { fprintf(fp,"%s<--",Vertices[k]); k=pre[k]; fprintf(fp,"(%d)",k+1); }while(k! =0); fprintf(fp,"%s",Vertices[v0]); } } fclose(fp); cout<<"保存文件成功! \n按任意键返回菜单……\n"; getchar(); getchar(); system("cls"); } 2.源文件(.cpp) #include #include"graph.h" usingnamespacestd; intmain() { system("color2A"); AdjMGraphG; intn,e,k,m,t; charo,ch; do { cout<<"*********************************************"; cout<<"\n|欢迎使用城市之间交通最小路径演示方案系统|\n"; cout<<"*********************************************\n\n"; cout<<"\n\n1.建立一个城市交通图(邻接矩阵)"; cout<<"\n\n2.计算单源(单个城市到其他城市)最短路径"; cout<<"\n\n3.计算任意两点(城市)最短路径"; cout<<"\n\n4.保存城市及城市间最短路径"; cout<<"\n\n5.有关该系统介绍"; cout<<"\n\n6.退出系统"; cout<<"\n====================================================================="; cout<<"\n请输入您的选择(,,,,): "; cin>>k; while(k>6||k<1) { cout<<"错误输入! (请选择(,,,,))。 按任意键继续……\n"; o=getchar(); getchar(); cout<<"\n请输入您的选择(,,,,): \n"; cin>>k; } system("cls"); switch(k) { case1: { cout<<"请选择: \n"; cout<<"1.系统自带数据\n"; cout<<"2.亲自输入演示\n"; cin>>m; system("cls"); if(m==1) { FILE*fp; fp=fopen("save.txt","r"); ch=fgetc(fp); while(ch! =EOF) { putchar(ch); ch=fgetc(fp); } fclose(fp); o=getchar(); getchar(); system("cls"); cout< }//文件读取 else { cout<<"\n为了方便演示请直接选取系统自带数据……\n"; cout<<"1.系统自带数据\n"; cout<<"2.亲自演示数据\n"; getchar(); if(o=getchar()=='1') { system("cls"); cout<<"您选择了系统自带演示数据(n=8,e=14): "; FILE*fp; fp=fopen("ne.txt","r"); fscanf(fp,"%d%d",&n,&e); fclose(fp); G.CreatG(n,e); G.PrintOut(); } else { cout<<"\n请输入图的总点数和总边数(n,e=? )"; cin>>n>>e; G.CreatG(n,e); G.PrintOut(); } cout<<"\n按任意键继续……\n"; o=getchar(); getchar(); system("cls"); cout< } }break; case2: { G.dijkstra(); G.display(); cout<<"\n按任意键继续……\n"; o=getchar(); getchar(); system("cls"); cout< }break; case3: { do { cout<<"请输入任意两点城市的编号(vi,vj): "; G.Floyd(); cout<<"是否想知道其他两城市之间最小距离? (是(Y/y),否(N/n))"; cin>>o; }while(o=='Y'||o=='y'); cout<<"\n按任意键继续……\n"; o=getchar(); getchar(); system("cls"); cout< }break; case4: { G.save(); system("cls"); cout< }break; case5: { cout<<"*********************************************\n"; cout<<"欢迎您使用交通路线图中最小路径系统\n"; cout<<"*********************************************\n"; cout<<"请选择: \n()系统详细信息\n"; cout<<"()中国铁路交通路径信息\n"; cin>>t; system("cls"); if(t==1) { FILE*fp; fp=fopen("help.txt","r"); ch=fgetc(fp); while(ch! =EOF) { putchar(ch); ch=fgetc(fp); } cout< fclose(fp); cout<<"按任意键继续……\n"; o=getchar(); getchar(); system("cls"); } } } }while(k>=0&&k<6); cout<<"\n\n再见! "< _getch(); return0; } 1.测试数据: (1)ne.txt: 814 (2)chengshi.txt: 北京 上海 南京 武汉 重庆 哈尔滨 沈阳 长春 (3)quanzhi.txt: 28821 17567 56845 16532 38238 27459 46321 43654 48109 6790 68765 (4)help.txt: (2)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 交通网 中的 路径