数据结构课程设计报告_最短路径C++

合集下载

C语言迪杰斯特拉实现最短路径算法

C语言迪杰斯特拉实现最短路径算法

数据结构课程设计报告----旅游咨询系统设计目录一、需求分析二、系统分析三、概要设计一、系统划分二、邻接矩阵建立流程图:三、迪杰斯特拉算法流图四、详细设计五、调试分析一、运行结果二、改进设想六、课设总结旅游咨询系统设计一、需求分析在交通网络日益发达的今天,人们出行有很多种方式、路线,而如何选择符合需要的方式路线成为大家的一大难题。

所以,在此我利用计算机建立一个旅游咨询系统。

在系统中采用图来构造各个城市之间的联系,图中顶点表示城市,边表示各个城市之间的路线,所带权值为两个城市间的路程、时间或车费等。

这个交通咨询系统可以回答旅客提出的各种问题,例如:如何选择一条路径使得从A城到B城里程最短;如何选择一条路径使得从A城到B城花费最低;如何选择一条路径使得从A 城到B城所用的时间最少等等的一系列问题。

二、系统分析设计一个旅游咨询系统,能咨询从任何一个城市顶点到其他城市顶点之间的最短路径(里程、最低花费或是最少时间等问题。

对于不同的咨询要求,可输入城市间的路程、所需时间或是所需费用等信息。

旅客可以在同一个系统中综合考虑自己的各目标城市,选择一个最佳的旅游路线和出行方式。

针对最短路径问题,在本系统中采用图的相关知识,采用了迪杰斯特拉算法,解决在实际情况中的最短路径问题,而迪杰斯特拉算法的时间复杂度为O(n2,空间复杂度为O(n。

本系统使用邻接矩阵存储无向图。

其中,建立矩阵的时间复杂度为O(n2,但是利用其查找一条边的时间复杂度为O(1。

本系统中包括了利用邻接矩阵建立图的存储结构和单源最短问题两大部分,使用指针数组实现利用一个程序实现最短路径和最短时间的运算。

并且本系统设置了人性化的系统提示菜单,方便使用者的使用。

三、概要设计一、系统划分该系统可以划分为三个部分:1、利用邻接矩阵建立图的存储结构;2、利用迪杰斯特拉算法解决单源最短路径问题;3、实现城市之间的最短路径问题和最短时间问题。

二、邻接矩阵建立流程图:四、详细设计本课程设计的源程序如下所示:#include#include#define MVNum 100#define Maxint 9999 /*将无穷大的数值设为9999*/ typedef char vertextype;/*建立无向图*/typedef int adjmatrix;typedef struct{vertextype vexs[MVNum];adjmatrix arcs[MVNum][MVNum];}mgraph;mgraph *G[2]; /*设置指针数组用以实现距离和时间最小值求取*/void city_number( /*输出城市代表序号*/{ printf("************************************************************************ *\n";printf(" 1、北京 2、上海 3、香港 4、天津 5、重庆 6、澳门 7、哈尔滨 8、石家庄";printf(" \n 9、兰州 10、昆明 11、成都 12、长春 13、沈阳 14、长沙 15、海口 16、西安";printf("\n************************************************************************ *\n";}void Createmgraph(int a,int n,int e /*建立无向邻接矩阵*/{int i,j,k;int w;for(i=1;i<=n;i++for(j=1;j<=n;j++if(i==j G[a]->arcs[i][j]=0; /*邻接矩阵对角线初始值设为0*/else G[a]->arcs[i][j]=Maxint; /*其他元素设为无穷大*/for(k=1;k<=e;k++ /*读入e条边数的信息*/{printf("\n输入图中各起点终点及其权值i,j,w:"; /*读入无向边及其权值*/scanf("%d,%d,%d",&i,&j,&w;G[a]->arcs[i][j]=w;G[a]->arcs[j][i]=w;}}void Dijkstra(int a,int v0,int N/*Dijkstra算法的实现和打印*/{enum boolean S[MVNum];/*终点集合*/int dist[MVNum],path[MVNum];/*dist表示源点v0到图中其余顶点的最短长度,path表示其对应的路径*/int i,wmin,u,num=1,k;for(i=1;i<=N;i++ /*数组dist和集合S付初值*/{dist[i]=G[a]->arcs[v0][i]; /*数组dist初值为邻接矩阵*/S[i]=0; /*集合S初值设为空集*/if(dist[i]else path[i]=0;}S[v0]=1; /*源点v0放入集合S中*/path[v0]=0;do{wmin=Maxint; /*wmin最小值设为无穷大*/u=v0;for(i=1;i<=N;i++if(S[i]==0 /*选择不在S中且距离最小的顶点u*/if((dist[i]{u=i;wmin=dist[i];}S[u]=1; /*把距离最小的顶点u放入集合S中*/for(i=1;i<=N;i++ /*修改不在S中的顶点距离*/if(S[i]==0if(dist[u]+G[a]->arcs[u][i]{dist[i]=dist[u]+G[a]->arcs[u][i];path[i]=u;}num++;}while(num<=N;printf("\n\t输出带权无向图的单元最短路径为:\n\t";/*打印v0到其他顶点的最短路径*/ for(i=1;i<=N;i++{if(S[i]==1{k=i;printf("\n\t顶点%d到%d之间的路径为:",v0,i;while(k!=v0{printf("%d<--",k; /*输出后继顶点*/k=path[k]; /*继续寻找下一个后继顶点*/}printf("%d",k; /*输出终点*/printf(",最短路径长度为%d\n",dist[i]; /*输出最短路径*/}else printf("\n\t顶点%d到%d之间没有路径!",v0,i;}printf("\n\t求一个城市到所有城市的最短路径结束,谢谢!\n\n\t\t";}void main( /*旅游咨询系统*/{int n,e,v,u,i,x;int z=0;G[1]=(mgraph *malloc(sizeof(mgraph; /*建立类型为mgraph的十字链表结构*/G[2]=(mgraph *malloc(sizeof(mgraph;printf("****************欢迎使用旅游咨询系统****************\n";printf("输入图中顶点个数和边数n,e:";scanf("%d,%d",&n,&e;city_number(;for(i=1;i<=n;i++ /*输入顶点信息*/{printf("\n请输入图的所有顶点i=";scanf("%d",&x;G[1]->vexs[i]=x; /*将顶点信息输入一维数组中*/G[2]->vexs[i]=x;}printf("\n请输入距离矩阵的数值\n";Createmgraph(1,n,e; /*建立距离矩阵*/ printf("\n距离矩阵建立完毕\n请输入时间矩阵的数值";Createmgraph(2,n,e; /*建立时间矩阵*/printf("\n无向图的存储结构建立完毕!\n";do{printf("\n\n\n************进行最短查询************\n";printf("=========================================\n";printf("1.求一个城市到所有城市的最短路径\n";printf("2.求一个城市到所有城市的最短时间\n";printf("3.退出\n";printf("=========================================\n";printf("请输入选择:";scanf("%d",&z; /*输入选择选择矩阵*/city_number(;if(z==1{printf("\n选择1 求一个城市到所有城市的最短路径\n";printf("求单源路径,输入源点v :"; /*输入源点v0*/scanf("%d",&v;Dijkstra(1,v,n; /*计算最短距离*/}else if(z==2{printf("\n选择2 求一个城市到所有城市的最短时间\n"; printf("求单源路径,输入源点,u :";scanf("%d",&u;Dijkstra(2,u,n; /*计算最短时间*/}else if(z==3printf("\n结束查询!谢谢使用!!\n";else printf("输入错误!!\n"; /*输入不为1-3则重新选择*/ }while(z!=3; /*输入3则退出*/printf("谢谢您的使用,再见!!!!\n";}五、调试分析一、运行结果1、输入顶点总数为6,边的总数为10,并输入顶点信息。

C语言版数据结构最短路径

C语言版数据结构最短路径

二.最短路径详细设计#include <stdio.h>#define MAXV 100 /*最大顶点个数*/#define INF 32767 /*用32767表示∞*/typedef int InfoType;/*以下定义邻接矩阵类型*/typedef struct{ int no; /*顶点编号*/InfoType info; /*顶点其他信息*/} VertexType; /*顶点类型*/typedef struct /*图的定义*/{ int edges[MAXV][MAXV]; /*邻接矩阵*/int vexnum,arcnum; /*顶点数,弧数*/VertexType vexs[MAXV]; /*存放顶点信息*/} MGraph; /*图的邻接矩阵类型*/void DispMat(MGraph g)/*输出邻接矩阵g*/{int i,j;for (i=0;i<g.vexnum;i++){for (j=0;j<g.vexnum;j++)if (g.edges[i][j]==INF)printf("%3s","∞");elseprintf("%3d",g.edges[i][j]);printf("\n");}}void Dijkstra(MGraph g,int v0) /*狄克斯特拉算法从顶点v0到其余各顶点的最短路径*/{int dist[INF], path[MAXV], s[MAXV], n;int p[MAXV][MAXV]; //存放是否有路径0?1int v;for(v=0;v<g.vexnum;++v){s[v]=0;dist[v]=g.edges[v0][v];for(n=0;n<g.vexnum;++n) //初始为空路径p[v][n]=0;if(dist[v]<INF)p[v0][v]=1;}dist[v0]=0;s[v0]=1; //将v0加入s集for(int i=1;i<g.vexnum;i++)//主循环,每次求v0到某个v顶点的最短路径,并加v 到s集{int min=INF; //min为当前所知离v0最近的距离for(n=0;n<g.vexnum;++n)if(!s[n]) //n顶点在v-s中if(dist[n]<min){v=n;min=dist[n];}s[v]=1; //v加入s集for(n=0;n<g.vexnum;++n) //更新当前最短距离if(!s[n] && (min+g.edges[v][n]<dist[n])){dist[n]=min+g.edges[v][n];//修改,n属于v-spath[n]=path[v];p[n][v]=1;}printf("到%d点的最短路径为:%d\n",v,dist[v]);}}void main(){int i,j,u=0;MGraph g;int A[MAXV][6]={{INF,5,INF,7,INF,INF},{INF,INF,4,INF,INF,INF},{8,INF,INF,INF,INF,9},{INF,INF,5,INF,INF,6},{INF,INF,INF,5,INF,INF},{3,INF,INF,INF,1,INF}};g.vexnum=6;g.arcnum=10;for (i=0;i<g.vexnum;i++) /*建立图9.1的邻接矩阵*/for (j=0;j<g.vexnum;j++)g.edges[i][j]=A[i][j];printf("\n");printf("有向图G的邻接矩阵:\n");DispMat(g);printf("从0点出发到各顶点的最短路径:\n");Dijkstra(g,u);printf("\n");}测试结果。

c语言课程设计最短路径

c语言课程设计最短路径

c语言课程设计最短路径一、教学目标本节课的教学目标是让学生掌握C语言中最短路径算法的基本概念和实现方法。

具体包括以下三个方面:1.知识目标:使学生了解最短路径问题的背景和意义,理解Dijkstra算法和A*算法的原理,学会使用C语言实现最短路径算法。

2.技能目标:培养学生运用C语言解决实际问题的能力,提高学生的编程技巧和算法思维。

3.情感态度价值观目标:激发学生对计算机科学的兴趣,培养学生的创新精神和团队合作意识。

二、教学内容本节课的教学内容主要包括以下几个部分:1.最短路径问题的定义和意义:介绍最短路径问题的背景,让学生了解其在实际应用中的重要性。

2.Dijkstra算法:讲解Dijkstra算法的原理,演示算法的实现过程,让学生学会使用C语言实现Dijkstra算法。

3.A算法:介绍A算法的原理,讲解算法的优势和不足,让学生了解并掌握A*算法的实现方法。

4.算法优化:讨论如何优化算法,提高算法的效率,让学生学会在实际问题中灵活运用算法。

三、教学方法为了达到本节课的教学目标,将采用以下几种教学方法:1.讲授法:讲解最短路径问题的基本概念和算法原理,让学生掌握基本知识。

2.案例分析法:分析实际问题,让学生了解最短路径算法在实际应用中的价值。

3.实验法:让学生动手实践,学会使用C语言实现最短路径算法,提高编程能力。

4.讨论法:学生进行小组讨论,培养学生的团队合作意识和创新精神。

四、教学资源为了支持本节课的教学内容和教学方法,将准备以下教学资源:1.教材:《C语言程序设计》2.参考书:《数据结构与算法分析》3.多媒体资料:最短路径算法的动画演示4.实验设备:计算机、网络设备通过以上教学资源的支持,相信能够有效地帮助学生掌握最短路径算法,提高学生的编程能力。

五、教学评估为了全面、客观地评估学生在最短路径算法学习过程中的表现,将采用以下评估方式:1.平时表现:观察学生在课堂上的参与程度、提问回答和小组讨论的表现,以了解学生的学习态度和理解程度。

数据结构课程设计报告_最短路径

数据结构课程设计报告_最短路径

青岛理工大学琴岛学院
设计报告
课题名称:数据结构课程设计
学院:计算机工程系
专业班级:计算机网络技术
学号:aaaaaa
学生: aaa
指导教师: aaaaaaa
青岛理工大学琴岛学院教务处
2011 年 12 月 18日
四.调试分析(调试过程中出现的问题及处理方式)调试出现的界面
1)进入程序弹出查询信息对话框如图2:
图2
2) 输入查询信息,显示路径长度及最短路径,如果输入代号不在0~24之内,提示出错。

图3
图4
B.出现的问题及解决方式
1、在执行程序的时候不能显示最短的距离
解决方法:增加一个函数调用,调用的函数为ShortestPath(v0); /*计算两个城市之间的最短路径*/
2、不能连续查询,即查询一次完成后,必须重新运行才能就进行二次查询
解决方法:在代码中添加while( ) 语句printf("是否继续,1(继续查询),0(退出查询)");
printf("\n"); scanf("%d",&ch); 详见图5
图 5。

数据结构最短路径课设报告

数据结构最短路径课设报告

数据结构与算法课程设计报告书题目:导航最短路径查询班级:11101111学号:**********姓名:教师周期:2012.12.17-2012.12.21 (以下由验收教师填写)成绩:2012年12月21日《导航最短路径查询》一、课程设计的目的与要求(一)课程设计目的与任务通过学习,了解并初步掌握设计、实现较大系统的完整过程,包括系统分析、编码设计、编码集成以及调试分析,熟练掌握数据结构的选择、设计、实现、以及操作方法,为进一步的开发应用打好基础。

(二)题目要求要求在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。

同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。

二、设计正文1、系统分析和开发背景该程序所做的工作是给司机们提供最佳路线,来提高能源和时间的合理利用。

(1)把城市交通线路转化为图,从而对图进行相应的结构存储;(2)程序的输出信息主要为:起始城市到目的城市的最短路路径。

(3)程序的功能主要包括:城市之间路径的存储,最短路径的计算,以及最短路径和邻接矩阵的输出;2 、功能详细描述先假设有四个城市甲乙丙丁,甲乙相距2千米,且只有从乙到甲的单程线路。

甲丙相距7千米,且只有从甲到丙的单程线路。

甲丁相距4千米,且只有从甲到丁的单程线路。

乙丙相距5千米,且只有从丙到乙的单程线路。

乙丁相距3千米,且只有从丁到乙的单程线路。

丙丁相距3千米,且只有从丁到丙的单程线路。

戊甲相距6千米,且只有从戊到甲的单程线路。

戊丁相距2千米,且只有从丁到戊的单程线路。

乙己相距8千米,且只有从乙到己的单程线路。

丙己相距6千米,且只有从己到丙单程线路。

编程出能求出个一点到任一点的最短路经。

3、数据结构设计(1)typedef struct{int no; //顶点编号InfoType info; //顶点其他信息,这里用于存放边的权值}VertexType; //顶点类型typedef struct //图的定义{int edges[MAXV][MAXV]; //邻接矩阵int n,e; //顶点数,弧数VertexType vexs[MAXV]; //存放顶点信息}MGraph; //图的邻接矩阵类型//以下定义邻接表类型typedef struct ANode //弧的结点结构类型{int adjvex; //该弧的终点位置struct ANode *nextarc; //指向下一个弧的指针InfoType info; //该弧的相关信息,这里用于存放权值}ArcNode;typedef int Vertex;typedef struct Vnode //邻接表头结点的类型{Vertex data; //顶点信息ArcNode *firstarc[MAXV]; //指向第一条弧}VNode;typedef VNode AdjList[MAXV];//AdjList是邻接表类型typedef struct{AdjList adjlist; //邻接表int n,e; //图中顶点数n和边数e}ALGraph; //图的邻接表类型4、主要功能逻辑过程和实现算法用到的主要函数:(1)void DispMat(MGraph g) //输出邻接矩阵(2)void ppath(int path[][MAXV],int v,int endv) //输出相应选择的起点和终点的最短路。

数据结构课程设计最短路径问题实验报告

数据结构课程设计最短路径问题实验报告

目录交通咨询系统设计(最短路径问题)一、概述在交通网络日益发达的今天,针对人们关心的各种问题,利用计算机建立一个交通咨询系统。

在系统中采用图来构造各个城市之间的联系,图中顶点表示城市,边表示各个城市之间的交通关系,所带权值为两个城市间的耗费。

这个交通咨询系统可以回答旅客提出的各种问题,例如:如何选择一条路径使得从A城到B城途中中转次数最少;如何选择一条路径使得从A城到B城里程最短;如何选择一条路径使得从A城到B城花费最低等等的一系列问题。

二、系统分析设计一个交通咨询系统,能咨询从任何一个城市顶点到另一城市顶点之间的最短路径(里程)、最低花费或是最少时间等问题。

对于不同的咨询要求,可输入城市间的路程、所需时间或是所需费用等信息。

针对最短路径问题,在本系统中采用图的相关知识,以解决在实际情况中的最短路径问题,本系统中包括了建立图的存储结构、单源最短问题、对任意一对顶点间最短路径问题三个问题,这对以上几个问题采用了迪杰斯特拉算法和弗洛伊德算法。

并未本系统设置一人性化的系统提示菜单,方便使用者的使用。

三、概要设计可以将该系统大致分为三个部分:① 建立交通网络图的存储结构;② 解决单源最短路径问题;③ 实现两个城市顶点之间的最短路径问题。

四、详细设计建立图的存储结构定义交通图的存储结构。

邻接矩阵是表示图形中顶点之间相邻关系的矩阵。

设G=(V,E)是具有n个顶点的图,则G的邻接矩阵是具有如下定义的n阶方阵。

注:一个图的邻接矩阵表示是唯一的!其表示需要用一个二维数组存储顶点之间相邻关系的邻接矩阵并且还需要用一个具有n个元素的一维数组来存储顶点信息(下标为i的元素存储顶点V的信息)。

i邻接矩阵的存储结构:附录#include<>#include<>#defineMVNum100#defineMaxint32767enumboolean{FALSE,TRUE}; typedefcharVertexType;typedefintAdjmatrix;typedefstruct{VertexTypevexs[MVNum];Adjmatrixarcs[MVNum][MVNum];}MGraph;intD1[MVNum],p1[MVNum];intD[MVNum][MVNum],p[MVNum][MVNum]; voidCreateMGraph(MGraph*G,intn,inte){inti,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条边的及w:\n",e);for(k=1;k<=e;k++){scanf("%d,%d,%d",&i,&j,&w);G->arcs[i][j]=w;}printf("有向图的存储结构建立完毕!\n"); }voidDijkstra(MGraph*G,intv1,intn){intD2[MVNum],p2[MVNum];intv,i,w,min;enumbooleanS[MVNum];for(v=1;v<=n;v++){S[v]=FALSE;D2[v]=G->arcs[v1][v];if(D2[v]<Maxint)p2[v]=v1;elsep2[v]=0;}D2[v1]=0;S[v1]=TRUE;for(i=2;i<n;i++){min=Maxint;for(w=1;w<=n;w++)if(!S[w]&&D2[w]<min){v=w;min=D2[w];}S[v]=TRUE;for(w=1;w<=n;w++)if(!S[w]&&(D2[v]+G->arcs[v][w]<D2[w])){D2[w]=D2[v]+G->arcs[v][w];p2[w]=v;}}printf("路径长度路径\n");for(i=1;i<=n;i++){printf("%5d",D2[i]);printf("%5d",i);v=p2[i];while(v!=0){printf("<-%d",v);v=p2[v];}printf("\n");}}voidFloyd(MGraph*G,intn){inti,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;elsep[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]<D[i][j]){D[i][j]=D[i][k]+D[k][j];p[i][j]=p[i][k];}}}}voidmain(){MGraph*G;intm,n,e,v,w,k;intxz=1;G=(MGraph*)malloc(sizeof(MGraph));printf("输入图中顶点个数和边数n,e:");scanf("%d,%d",&n,&e);CreateMGraph(G,n,e);while(xz!=0){printf("************求城市之间最短路径************\n");printf("=========================================\n");printf("1.求一个城市到所有城市的最短路径\n");printf("2.求任意的两个城市之间的最短路径\n");printf("=========================================\n");printf("请选择:1或2,选择0退出:\n");scanf("%d",&xz);if(xz==2){Floyd(G,n);printf("输入源点(或起点)和终点:v,w:");scanf("%d,%d",&v,&w);k=p[v][w];if(k==0)printf("顶点%d到%d无路径!\n",v,w);else{printf("从顶点%d到%d最短路径路径是:%d",v,w,v);while(k!=w){printf("--%d",k);k=p[k][w];}printf("--%d",w);printf("径路长度:%d\n",D[v][w]);}}elseif(xz==1)printf("求单源路径,输入源点v:");scanf("%d",&v);Dijkstra(G,v,n);}printf("结束求最短路径,再见!\n"); }。

最短路径_数据结构课程设计报告

最短路径_数据结构课程设计报告

最短路径_数据结构课程设计报告第一篇:最短路径_数据结构课程设计报告数据结构课程设计《数据结构》课程设计报告设计题目:____医院选址____________ 姓名:__________________ 学号:________________ 专业:___________院系:____________班级:_________________ 指导教师:_________________年 1月 3 日数据结构课程设计一、问题描述(1)题目内容:有n个村庄,现要从这n个村庄中选择一个村庄新建一所医院,使其余的村庄到这所医院的距离总和来说较短。

(n>=5)(2)基本要求:(3)可以输出每一对点间的路径长度;然后选取偏心度,最小的偏心度即为所求。

二、需求分析(4)本程序的功能包括找出每一对点间的路径长度。

(5)然后算出每一对点的偏心度。

(6)其中最小的偏心度即为所求。

三、概要设计操作集合:(7)public:MGraph(DataType a[],int b[][MaxSize],int n,int e);//初始化邻接矩阵和路径(8)void Floyd();//弗洛伊德算法的实现(9)void getE();//获取偏心度(10)void showdist();//把每一对顶点之间的路径权值show出来(11)~MGraph(){} //类的析构函数四、数据结构设计(1)DataType vertex[MaxSize];//存放图中顶点的数组(2)intarc[MaxSize][MaxSize];//存放图中边的数组(3)string path[MaxSize][MaxSize];//存放从Vi到Vj的最短路径,初始为//path[i][j]=“ViVj”(4)int dist[MaxSize][MaxSize];//存放求得的最短路径长度(5)int vertexNum, arcNum;//图的顶点数和边数(6)int E[MaxSize][2];//获取最小偏心度和该顶点五、算法设计1.算法分析1)对带权有向图的,调用Floyd算法,对每一对顶点间的最短路径长度的矩阵;2)对最短路径长度矩阵的每列求最大值,即得到各点的偏心度;3)具有最小偏心度的顶点即为所求。

数据结构迷宫最短路径实验报告

数据结构迷宫最短路径实验报告

实验报告课程名:数据结构(C语言版)实验名:迷宫问题II姓名:班级:学号:撰写时间:2014/10/10一实验目的与要求1. 了解栈的应用2. 利用栈在迷宫中找到一条路二实验内容•一个迷宫如图1所示, 是由若干个方格构成的一个矩形, 其中有唯一的一个入口(用⃝标示), 有唯一的一个出口(用△标示). 图中深色的方格无法到达, 浅色的方格都是可以到达的. 每一次只能从当前方格前进到与当前方格有公共边的方格中(因此前进方向最多有四个).•本次实验的迷宫问题要求找到从入口到出口的最短的路.图1:迷宫三实验结果与分析程序:#include <stdio.h>#include <stdlib.h>int Maze(int ox,int oy,int ex,int ey,int rnum,int cnum,int a[rnum][cnum]){int b[rnum][cnum];int i,j,Znum=0;for(i=0;i<rnum;++i){for(j=0;j<cnum;++j){b[i][j]=a[i][j];if(a[i][j]==0){Znum=Znum+1;}}}int Qx[Znum+1], Qy[Znum+1], P[Znum+1], head=0, tail=0; for(i=0;i<Znum+1;++i){Qx[i]=-10;Qy[i]=-10;P[i]=-10;}/*int dx[4] = {0,1,0,-1};int dy[4] = {-1,0,1,0};int neighbor_num = 4;*/int dx[8] = {-1, 0, 1,1,1,0,-1,-1};int dy[8] = {-1,-1,-1,0,1,1, 1, 0};int neighbor_num = 8;if(ox==ex && oy==ey){printf("(%d,%d)",ox,oy);}else{Qx[tail]=ox;Qy[tail]=oy;P[tail]=-1;++tail;b[ox][oy]=2;}int brand = -1;while(tail>head){for(i=0;i<neighbor_num;i++){int tx = Qx[head]+dx[i];int ty = Qy[head]+dy[i];if(b[tx][ty]==0){if(tx==ex && ty==ey){printf("(%d,%d), ",tx,ty);int t = head;while(t>=0){printf("(%d,%d), ",Qx[t],Qy[t]);t=P[t];}head=tail;brand=1;break;}else{Qx[tail]=tx;Qy[tail]=ty;P[tail]=head;++tail;b[tx][ty]=2;}}}++head;}return(brand);}int main(int argc, char *argv[]) {int rnum = 10;int cnum = 10;int a[10][10]={{1,1,1,1,1,1,1,1,1,1},{1,0,0,1,0,0,0,1,0,1},{1,0,0,1,0,0,0,1,0,1},{1,0,0,0,0,1,1,0,0,1},{1,0,1,1,1,0,0,0,0,1},{1,0,0,0,1,0,0,0,0,1},{1,0,1,0,0,0,1,0,0,1},{1,0,1,1,1,0,1,1,0,1},{1,1,0,0,0,0,0,0,0,1},{1,1,1,1,1,1,1,1,1,1}};//假设外面有一层不可到达的方块,故迷宫成了10乘10型int ox=1,oy=1,ex=rnum-2,ey=cnum-2;int brand = Maze(ox,oy,ex,ey,rnum,cnum,a);if(brand<0){printf("There is no way\n");}return 0;}图1:实验结果截图。

c课程设计最短路径

c课程设计最短路径

c课程设计最短路径一、教学目标本节课的教学目标是让学生掌握最短路径算法的基本原理和实现方法。

知识目标包括了解最短路径问题的背景和意义,理解迪杰斯特拉算法和贝尔曼-福特算法的原理,掌握这两种算法的实现和优化方法。

技能目标包括能够运用迪杰斯特拉算法和贝尔曼-福特算法解决实际问题,能够编写相应的程序实现最短路径算法。

情感态度价值观目标包括培养学生的逻辑思维能力,提高学生解决实际问题的能力,激发学生对计算机科学和算法的兴趣。

二、教学内容本节课的教学内容主要包括最短路径问题的定义和意义,迪杰斯特拉算法和贝尔曼-福特算法的原理和实现,以及最短路径算法的应用。

首先,介绍最短路径问题的背景和意义,引导学生了解最短路径问题在实际中的应用。

然后,讲解迪杰斯特拉算法和贝尔曼-福特算法的原理,通过示例让学生理解这两种算法的实现方法。

最后,介绍最短路径算法的应用,让学生了解如何运用这两种算法解决实际问题。

三、教学方法为了达到本节课的教学目标,将采用多种教学方法相结合的方式进行教学。

首先,采用讲授法,向学生讲解最短路径问题的定义和意义,以及迪杰斯特拉算法和贝尔曼-福特算法的原理和实现方法。

然后,采用案例分析法,通过具体的例子让学生理解这两种算法的应用。

接着,采用讨论法,让学生分组讨论并解决实际问题,培养学生的逻辑思维能力和团队合作能力。

最后,采用实验法,让学生编写程序实现最短路径算法,提高学生的动手能力和实际问题解决能力。

四、教学资源为了支持本节课的教学内容和教学方法的实施,将准备多种教学资源。

教材方面,选择《数据结构与算法》一书,作为学生学习的参考。

参考书方面,推荐学生阅读《算法导论》一书,以深入了解算法的原理和实现。

多媒体资料方面,制作PPT课件,通过图形和动画等方式直观地展示最短路径问题的实例和算法的实现过程。

实验设备方面,准备计算机和网络设备,让学生能够编写程序并实际运行最短路径算法。

五、教学评估本节课的评估方式将包括平时表现、作业和考试三个部分。

数据结构最短路径课程设计

数据结构最短路径课程设计

数据结构最短路径课程设计一、课程目标知识目标:1. 理解图的基本概念,掌握图的表示方法及其特性;2. 掌握最短路径的两种经典算法:Dijkstra算法和Floyd算法;3. 能够运用所学算法解决实际生活中的最短路径问题。

技能目标:1. 能够运用数据结构中的图,进行实际问题的建模;2. 能够编写并实现Dijkstra算法和Floyd算法,解决最短路径问题;3. 能够通过分析、比较两种算法,选择合适的算法解决特定问题。

情感态度价值观目标:1. 培养学生面对复杂数据结构问题时,保持积极探究、解决问题的态度;2. 培养学生的团队协作能力,学会在团队中分享、交流、互助;3. 通过解决实际生活中的问题,培养学生将所学知识应用于实践的意识。

课程性质分析:本课程为数据结构中的图部分,以最短路径为具体实例,帮助学生理解图的概念及其在实际中的应用。

学生特点分析:学生已具备一定的编程能力和数据结构基础知识,但对图的相关概念和算法掌握不足,需要通过具体案例和实际操作,提高理解和应用能力。

教学要求:1. 以实际问题引入,激发学生的学习兴趣;2. 采用任务驱动法,引导学生自主探究、实践;3. 结合课堂讲解和实际操作,使学生在实践中掌握知识;4. 注重团队合作,培养学生的沟通与协作能力。

二、教学内容1. 图的基本概念:图的定义、图的表示方法(邻接矩阵、邻接表)、图的遍历(深度优先搜索、广度优先搜索)。

2. 最短路径问题:最短路径的定义、最短路径算法的应用场景。

3. Dijkstra算法:算法原理、算法步骤、实例分析、编程实现。

4. Floyd算法:算法原理、算法步骤、实例分析、编程实现。

5. 算法比较与分析:Dijkstra算法与Floyd算法的优缺点比较、适用场景分析。

6. 实践项目:设计一个实际场景的最短路径问题,要求学生运用所学算法进行解决。

教学内容安排与进度:第一课时:图的基本概念、图的表示方法、图的遍历。

第二课时:最短路径问题、Dijkstra算法原理与实例分析。

数据结构实验报告十一—最短路径问题

数据结构实验报告十一—最短路径问题

问题描述:若用有向网表示某地区的公路交通网,其中顶点表示该地区的一些主要场所,弧表示已有的公交线路,弧上的权表示票价。

试设计一个交通咨询系统,指导乘客以最少花费从该地区中的某一场所到达另一场所。

基本要求:(1)从文件中读入有向网中顶点的数量和顶点间的票价的矩阵。

(2)以用户指定的起点和终点,输出从起点到终点的花费。

一、需求分析:1、本程序需要用矩阵来存储图的各种信息。

2、测试数据输入(文件)5-1 10 3 20 -1-1 -1 -1 5 -1-1 2 -1 -1 15-1 -1 -1 -1 11-1 -1 -1 -1 -1(用户)起点 0终点 4输出18实现提示:(1)设图的顶点大于1个,不超过30个,每个顶点用一个编号表示(如果一个图有n个顶点,则它们的编号分别为0, 1, 2, 3, …, n-1)。

(2)此题为求有向网中顶点间最短路径问题,可建立以票价为权的邻接矩阵,用Dijkstra算法求最短路径长度。

(3) Dijkstra算法中有一个辅助向量D,表示当前所找到的从源点到其它点的最短路径长度。

因为每次都要在D中找最小值,为提高性能,用最小值堆的优先队列存储D值。

(4)考虑没有路径时的输出。

二、概要设计:抽象数据类型:为实现上述功能需建立一个二维数组和图类。

算法的基本思想:1、图的信息的读取:定义一个二维数组,将图的信息读入,并将两边距离为-1的边转换为一个较大的数(>>途中各点之间的距离)。

2、Dijkstra算法:根据输入的第一个结点首先找到(直接距离)该点最近的A,则这两点之间的边是必须的,然后比较通过A到其他点的距离l1和直接到其他点的距离l2。

如果l1<l2,则用l1的距离替换l2。

重复上述操作n-1(n为结点数)次。

得到的即为第一个结点到其他结点的最短距离。

程序的流程程序由三个模块组成:输入模块:读入图的信息(用矩阵进行存储)。

处理模块:Dijkstra算法。

数据结构课程设计报告-最短路径算法-二叉树的三种遍历

数据结构课程设计报告-最短路径算法-二叉树的三种遍历

数据结构课程设计报告班级:计算机科学与技术132班姓名:赖恒财指导教师:董跃华成绩:32信息工程学院2015 年7月8日目录图的最短路径算法实现1. 需求分析 (1)1.1 程序设计内容 (1)1.2 设计要求 (1)2.概要设计 (2)3.详细设计 (2)3.1 数据类型的定义 (2)3.2 功能模块的设计 (2)3.3 主程序流程 (9)4.调试分析 (10)4.1 问题回顾和分析 (10)4.2.经验和体会 (11)5.测试结果 (12)二叉树的遍历1.设计目的 (13)2.需求分析 (14)2.1课程设计的内容和要求 (14)2.2选题的意义及背景 (14)3.概要设计 (14)3.1设计思想 (14)3.2程序数据类型 (16)3.3程序模块分析 (16)3.3.1置空栈 (16)3.3.2入栈 (17)3.3.3出栈 (17)3.3.4取栈顶操作 (17)3.3.5判空栈 (17)3.4函数关系: (18)4.详细设计 (18)4.1二叉树算法程序截图和结果 (18)5.程序测试结果及问题分析 (19)6.总结 (20)参考文献 (21)附录1 (22)附录2 (26)图的最短路径算法实现----基于floyd最短路径算法1.需求分析设计校园平面图,所含景点不少于8个。

以图中顶点表示学校内各景点,存放景点的名称、景点介绍信息等;以边表示路径,存放路径长度信息。

要求将这些信息保存在文件graph.txt中,系统执行时所处理的数据要对此文件分别进行读写操作。

1.1程序设计内容1.从文件graph.txt中读取相应数据, 创建一个图,使用邻接矩阵表示图;2.景点信息查询:为来访客人提供校园任意景点相关信息的介绍;3.问路查询:为来访客人提供校园任意两个景点之间的一条最短路径。

1.2 设计要求(1) 程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应。

(2) 程序要添加适当的注释,程序的书写要采用缩进格式。

数据结构实验报告 最短路径

数据结构实验报告 最短路径

实验报告实验名称最短路径课程名称数据结构与算法实验||专业班级:信息安全学号:姓名:实验六最短路径一、实验目的1.学习掌握图的存储结构2.学会编写求最短路径的算法二、实验内容1、实验题目编写代码实现Dijkstra生成最短路径的算法,其中要有完整的图的输入输出2、简单介绍图的存储:用邻接矩阵,这样会方便不少。

邻接矩阵是一个二维数组,数组中的元素是边的权(一些数值),数组下标号为结点的标号。

(1)例如二维数组中的一个元素M[5][6]的值为39,则表示结点5、6连接,且其上的权值为39。

(2)用邻接矩阵存储图,对图的读写就简单了。

因为邻接矩阵就是一个二维数组,因此对图的读写就是对二维数组的操作。

只要能弄清楚边的编号,就能把图读入了。

用一对结点表示边(也就是输入的时候输入一对结点的编号)求最短路径的算法:求最短路径就是求图中的每一个点到图中某一个给定点(这里认为是编号为0的点)的最短距离。

具体算法就是初始有一个旧图,一个新图。

开始的时候旧图中有所有的结点,新图中初始为只有一个结点(源点,路径的源头)。

整个算法就是不停的从旧图中往新图中添加点,直到所有的点都添加到新图中为止。

要实现这个算法,除了用二维数组保存图,还需要使用到两个辅助的数组数组find[N]:此数组是用来表示标号对应的结点是否已经被添加到新图中(因为只有旧图中的点我们才需要添加到新图中,并且只有旧图中点到源点的距离,我们才需要进行更新)其中N为图中结点的个数。

数组distance[N]:此数组记录图中的点到源点的距离。

这个数组里面存放的值是不断进行更新的。

其中N为图中结点的个数。

3、程序简单模板只是参考,不需要照着这个来写//最短路径#ifndef MYGRAPH_H_#define MYGRAPH_H_class MyGraph{public:void readDirectedGraph();MyGraph(int size);//构造函数中设置图的大小,分配空间void writeGraph();void shortPath(int source);//求最短路径protected:private:int **m_graph;//用二维数组保存图int m_size;//图的大小};#endif///////////////////////////////////////////// //////////////////////////构造函数中设置图的大小,分配空间MyGraph::MyGraph(int size){int i,j;m_size=size;//给图分配空间m_graph=new int* [m_size];for (i=0;i<m_size;i++){m_graph[i]=new int[m_size];}for (i=0;i<m_size;i++){for(j=0;j<m_size;j++){m_graph[i][j]=INT_MAX;}}}三、实验代码#include<iostream>#include <iomanip>#include <stack>#include <deque>#include <fstream>using namespace std;struct primnode{public:char begvex;char endvex;int lowcost;};struct adknode{int dist;//最近距离char way[50];//顶点数组int nodenum;//经过的顶点数};class Mgraph//邻接矩阵储存结构{public:Mgraph(){}~Mgraph(){}void CreatMGraph();void DFS (int );//用递归实现void DFS1(int );//非递归void BFS(int );void print();void prim();int mini();int low();//最短距离函数的辅助函数int LocateVex(char);void kruskal();void Dijkstra();void Floyd();private:int number;//顶点数目int arcnum;//边的数目char vexs[50];int arcs[50][50];int visited[50];//便利时的辅助工具primnode closeedge[50];//primadknode dist[50];//最短路径int D[20][20];//floyd算法距离int P[20][20][20];//floyd算法路径};int Mgraph::LocateVex(char s){for(int i=0;i<number;i++)if (vexs[i]==s)return i;return -1;}void Mgraph::print(){cout<<"顶点为:";for(int k=0;k<number;k++)cout<<vexs[k];cout<<endl;for(int i=0;i<number;i++){for(int j=0;j<number;j++)cout<<setw(6)<<left<<arcs[i][j]<<" ";cout<<endl;}for(int m=0;m<number;m++)cout<<visited[m];cout<<endl;}void Mgraph::CreatMGraph()//图的邻接矩阵储存结构{char vex1,vex2;int i,j,k,m;cout<<"请输入定点数,边数:"<<endl;cin>>number>>arcnum;cout<<"请输入顶点(字符串类型):"<<endl;for(i=0;i<number;i++)cin>>vexs[i];for(i=0;i<number;i++)for(j=0;j<number;j++)arcs[i][j]=1000;for(k=0;k<arcnum;k++){cout<<"请输入边的两个顶点及边的权值:"<<endl; cin>>vex1>>vex2>>m;i=LocateVex(vex1);j=LocateVex(vex2);arcs[i][j]=m;arcs[j][i]=m;}}void Mgraph::DFS(int i=0)//用递归实现{int j;cout<<vexs[i]<<"------>";visited[i]=1;for (j=0;j<number;j++){if(!(arcs[i][j]==1000)&&!visited[j])DFS(j);}}void Mgraph::DFS1(int i=0)//非递归{stack<int> st;st.push(i);while(!st.empty()){int j=st.top();st.pop();cout<<vexs[j]<<"---->";visited[j]=1;for(int k=0;k<number;k++){if((!(arcs[j][k]==1000))&&!visited[k])st.push(k);}}}void Mgraph::BFS(int i=0)//广度优先遍历{deque<int> de;de.push_back(i);cout<<vexs[i]<<"------>";visited[i]=1;while(!de.empty()){int k=de.front();for(int j=0;j<number;j++){if(arcs[k][j]!=1000&&!visited[j]){cout<<vexs[j]<<"------>";visited[j]=1;de.push_back(j);}}de.pop_front();}}int Mgraph::mini(){static int i;int min=0;for (int j=0;j<number;j++){if(!visited[j]){if (closeedge[min].lowcost>closeedge[j].lowcost){min=j;}}}i=min;cout<<"包括边("<<closeedge[i].begvex<<","<<closeedge[i].endvex<<")"; return i;}void Mgraph::prim(){char u;cout<<"请输入起始顶点:"<<endl;cin>>u;int i=LocateVex(u);visited[i]=1;for(int j=0;j<number;j++){closeedge[j].begvex=u;closeedge[j].endvex=vexs[j]; closeedge[j].lowcost=arcs[i][j];}for (int m=1;m<number;m++){int n=mini();visited[n]=1;closeedge[n].lowcost=1000;for (int p=0;p<number;p++){if(!visited[p]){if(arcs[p][n]<closeedge[p].lowcost){closeedge[p].lowcost=arcs[p][n];closeedge[p].begvex=vexs[n];}}}}}void Mgraph::kruskal(){int a,b,k=0;int min=1000;int arcs1[20][20];for (int m=0;m<number;m++)visited[m]=m;//每一个顶点属于一颗树for (int i=0;i<number;i++)for(int j=0;j<number;j++)arcs1[i][j]=arcs[i][j];while (k<number-1){min=1000;for (int i=0;i<number;i++){for (int j=0;j<number;j++){if (arcs1[i][j]<min){a=i;b=j;min=arcs1[i][j];}}}if (visited[a]!=visited[b]){cout<<"包括边("<<vexs[a]<<","<<vexs[b]<<")";k++;for (int n=0;n<number;n++){if (visited[n]==visited[b])visited[n]=visited[a];}}elsearcs1[a][b]=arcs[b][a]=1000;}}void Mgraph::Dijkstra(){cout<<"请输入起始点"<<endl;char u;cin>>u;int i=LocateVex(u);visited[i]=1;for (int j=0;j<number;j++){dist[j].dist=arcs[i][j];dist[j].nodenum=0;}for (j=1;j<number;j++){int distance=1000;int min=0;for (int n=0;n<number;n++){if(!visited[n]){if (distance>dist[n].dist){distance=dist[n].dist;min=n;}}}int m=min;visited[m]=1;for (n=0;n<number;n++){if(!visited[n]){if((dist[m].dist+arcs[m][n])<dist[n].dist){dist[n].dist=dist[m].dist+arcs[m][n];dist[n].nodenum=0;for (int x=0;x<dist[m].nodenum;x++){dist[n].way[x]=dist[m].way[x];dist[n].nodenum++;}dist[n].way[dist[n].nodenum++]=vexs[m];} } } }//输出功能for (int n=0;n<number;n++){if (n!=i){ if(dist[n].dist<1000){cout<<vexs[i]<<"到"<<vexs[n]<<"的最近距离为:"<<dist[n].dist<<endl;cout<<"经过的顶点为:"<<vexs[i]<<"---->";for (int p=0;p<dist[n].nodenum;p++){ cout<<dist[n].way[p]<<"----->";}cout<<vexs[n]<<endl;}elsecout<<vexs[i]<<"到"<<vexs[n]<<"没有通路"<<endl;} } }void Mgraph::Floyd(){int i,j,m,n;for ( i=0;i<number;i++)for ( j=0;j<number;j++)for (m=0;m<number;m++)P[i][j][m]=0;for ( i=0;i<number;i++)for ( j=0;j<number;j++){D[i][j]=arcs[i][j];if(D[i][j]<1000){P[i][j][i]=1;P[i][j][j]=1;} }for ( i=0;i<number;i++)for ( j=0;j<number;j++)for (m=0;m<number;m++){if (i==j||j==m||i==m)continue;if (D[i][m]+D[m][j]<D[i][j]){D[i][j]=D[i][m]+D[m][j];for (n=0;n<number;n++){P[i][j][n]=P[i][m][n]||P[m][j][n];} } }for ( i=0;i<number;i++)for ( j=0;j<number;j++){if (D[i][j]<1000){cout<<vexs[i]<<"到"<<vexs[j]<<"的最近距离为:"<<D[i][j]<<endl;cout<<"经过的顶点为:";for (m=0;m<number;m++){if (P[i][j][m]){cout<<vexs[m]<<"------>";} }cout<<endl;}elseif (i!=j)cout<<vexs[i]<<"到"<<vexs[j]<<"没有通路"<<endl;}}int main(){Mgraph g;g.CreatMGraph();g.Floyd();return 0;}四、实验结果五、实验总结本次实验主要是学习掌握图的存储结构,学会编写求最短路径的算法。

《数据结构课程设计》最短路径问题实验报告

《数据结构课程设计》最短路径问题实验报告

目录一、概述 0二、系统分析 0三、概要设计 (1)四、详细设计 (4)4.1建立图的存储结构 (4)4.2单源最短路径 (5)4.3任意一对顶点之间的最短路径 (6)五、运行与测试 (7)参考文献 (10)附录 (11)交通咨询系统设计(最短路径问题)一、概述在交通网络日益发达的今天,针对人们关心的各种问题,利用计算机建立一个交通咨询系统。

在系统中采用图来构造各个城市之间的联系,图中顶点表示城市,边表示各个城市之间的交通关系,所带权值为两个城市间的耗费。

这个交通咨询系统可以回答旅客提出的各种问题,例如:如何选择一条路径使得从A城到B城途中中转次数最少;如何选择一条路径使得从A城到B城里程最短;如何选择一条路径使得从A城到B城花费最低等等的一系列问题。

二、系统分析设计一个交通咨询系统,能咨询从任何一个城市顶点到另一城市顶点之间的最短路径(里程)、最低花费或是最少时间等问题。

对于不同的咨询要求,可输入城市间的路程、所需时间或是所需费用等信息。

针对最短路径问题,在本系统中采用图的相关知识,以解决在实际情况中的最短路径问题,本系统中包括了建立图的存储结构、单源最短问题、对任意一对顶点间最短路径问题三个问题,这对以上几个问题采用了迪杰斯特拉算法和弗洛伊德算法。

并未本系统设置一人性化的系统提示菜单,方便使用者的使用。

三、概要设计可以将该系统大致分为三个部分:①建立交通网络图的存储结构;②解决单源最短路径问题;③实现两个城市顶点之间的最短路径问题。

迪杰斯特拉算法流图:弗洛伊德算法流图:四、详细设计4.1建立图的存储结构定义交通图的存储结构。

邻接矩阵是表示图形中顶点之间相邻关系的矩阵。

设G=(V,E)是具有n 个顶点的图,则G 的邻接矩阵是具有如下定义的n 阶方阵。

⎪⎩⎪⎨⎧∞>∈<=,其他情况或或,若0E(G)V ,V )V ,(V ],[j i j i ij W j i A 注:一个图的邻接矩阵表示是唯一的!其表示需要用一个二维数组存储顶点之间相邻关系的邻接矩阵并且还需要用一个具有n 个元素的一维数组来存储顶点信息(下标为i 的元素存储顶点i V 的信息)。

数据结构实验报告-最短路径

数据结构实验报告-最短路径

最短路径
--《数据结构实验报告》
1.基本思想
最短路径,顾名思义,就是两个点之间的最短距离。

本实验采用Dijkstra算法和Floyd算法。

Dijkstra算法和Prim算法思想很像,都是一种贪心的算法。

Dijkstra算法只能算出一个点到其他点的最短距离,而Floyd算法一次可以算出各点之间的最短距离。

2.用到的数据结构
邻接矩阵G表示图。

Dijkstra:
数组D[n]表示源点到其他点的最短距离,数组P[n]表示最后经过的上一个顶点。

Floyd:
A[n][n]存放迭代过程中的最短路径长度。

3.基本操作实现
Dijkstra:将V分为两个集合S和V-S,初始D[i]=C[1][i],P[i]=1。

从S外选取一个顶点w,是D[w]最小,于是从源点到达w中通过S中的顶点,且是一条最短路径,w加入S,从原来的D[v]和D[w]+C[w][v]中选择最小值作为D[v]新值,且P[v]=w,重复以上步骤。

Floyd:将每一个顶点都尝试着插入到两个顶点之间,若插入之后得到的路径长度小于插入之前,则保留插入点,将每一个点都尝试插入,得到最终的最短路径。

4.测试数据及测试结果
Dijkstra:
测试数据:
测试结果:
(输入节点,下面输出这个节点到源点0的最短路径)
Floyd:
测试数据:
测试数据:
生成的距离矩阵。

数据结构课程设计---交通旅游图的最短路径问题

数据结构课程设计---交通旅游图的最短路径问题

数据结构课程设计报告题目交通旅游图的最短路径问题学生姓名*****指导教师*****学院******专业班级******完成时间********摘要数据结构主要是一门研究非数值计算的程序设计问题中的计算机操作对象以及它们之间的关系和操作等的学科。

数据结构在计算机科学与技术中是一门综合性的专业基础课,其研究不仅涉及到计算机硬件的研究范围,而且和计算机软件的研究有着更密切的关系。

不论是编译程序过程还是操作系统都涉及到数据元素在存储器中的分配问题。

在计算机科学与技术中,数据结构不仅是一般程序性的基础,而且也是其他系统程序和大型程序的重要基础。

在交通网络非常发达,交通工具和交通方式不断更新的今天,人们在出差、旅游或做其它出行时,不仅关心节省费用,而且对里程和所需时间等问题也感兴趣。

对于这样一个人们关心的问题,可用一个图结构来表示交通网络系统,利用计算机建立一个交通咨询系统。

图中顶点表示站点之间的交通关系。

这个交通系统可以回答旅客提出的各种问题。

比如任意一个站点到其他站点的最短路径,任意两个站点之间的最短路径问题。

本次设计的交通咨询系统主要是运用C语言来完成交通图的存储、图中顶点的最短路径和任意一对顶点间的最短路径问题。

关键字:数据结构课程设计交通咨询系统目录前言 (1)第一章设计要求 (2)1.1设计内容 (2)1.2设计目的 (3)1.3设计分析 (4)第二章系统功能模块的设计 (5)2.1 系统功能分析与设计 (5)2.1.1系统简介 (5)2.1.2 系统流程图 (5)2.2 各功能模块简介 (6)2.2.1结构体的建立 (6)2.2.2 图的建立与初始化 (6)2.2.3 邻接矩阵的输出 (8)2.2.4 显示函数 (8)2.2.5 最短路径算法 (9)2.2.6主函数 (10)第三章实践结果与调试 (12)3.1运行结果 (12)3.1.1主界面 (12)3.1.2查询站点编号模块 (12)3.1.3邻接矩阵查询模块 (12)3.1.4最短路径查询模块 (13)3.2运行调试及发现问题 (15)3.2.1调试过程 (15)3.2.2发现问题 (15)第四章设计总结与心得 (16)附录:程序源代码 (18)前言乘汽车旅行的人总希望找出到目的地的尽可能短的行程。

c最短路径课程设计

c最短路径课程设计

c 最短路径课程设计一、课程目标知识目标:1. 学生能理解图论中最短路径的基本概念,掌握Dijkstra算法与Floyd算法的计算步骤。

2. 学生能够运用所学算法解决实际问题,找出加权图中两点间的最短路径。

3. 学生能够了解最短路径问题在实际生活中的应用,如地图导航、网络路由等。

技能目标:1. 学生通过案例分析和上机实践,掌握使用编程语言(如Python)实现最短路径算法。

2. 学生能够运用逻辑思维,分析并解决图论中的路径问题,提高问题解决能力。

3. 学生能够运用数据结构和算法,对复杂问题进行抽象和建模。

情感态度价值观目标:1. 培养学生对数据结构与算法的兴趣,激发他们主动探索和研究的热情。

2. 培养学生合作学习、分享交流的良好习惯,增强团队协作能力。

3. 通过最短路径问题,引导学生认识到数学与计算机科学在解决实际问题中的价值,提高他们对科学的敬畏之心。

本课程针对高中年级学生,结合数学和计算机科学知识,以培养逻辑思维、问题解决能力和团队协作为核心,使学生在掌握最短路径知识的同时,提高实际应用能力和科学素养。

二、教学内容1. 图论基础知识回顾:图的定义、顶点和边、路径与连通性。

2. 最短路径的概念:介绍最短路径的定义,理解加权图和无权图的最短路径问题。

3. Dijkstra算法:- 算法原理讲解与示例演示。

- 代码实现:使用Python语言实现Dijkstra算法。

- 应用案例分析:如城市间最短距离计算。

4. Floyd算法:- 算法原理讲解与示例演示。

- 代码实现:使用Python语言实现Floyd算法。

- 应用案例分析:如网络路由问题。

5. 最短路径算法比较与讨论:- 对比Dijkstra和Floyd算法的优缺点。

- 探讨算法适用场景和效率问题。

6. 上机实践:- 编程实践:学生独立完成指定图的最短路径计算。

- 团队合作:分组讨论并解决实际问题,如设计一个校园导航系统。

7. 拓展学习:- 了解其他最短路径算法,如Bellman-Ford算法。

火车路线查询最短路径数据结构C

火车路线查询最短路径数据结构C

c[j]=Vertices[k].city; k=path[k]; } while(k!=v); j++; c[j]=Vertices[k].city; for(int n=j;n>=1;n--) {
cout<<c[n]; if(n!=1) cout<<"-->"; } cout<<endl; }
Graph(); void input(); 息*/ void add(); 息*/ void change(); 息*/ void del(); 息*/ void show(); 息*/ void select_path1(); 路程查询*/ void select_path2(); 路程查询*/ private: int Edge[MAXVertices][MAXVertices]; int numE,numV; Vertex Vertices[MAXVertices]; };
path[i]=v; else
path[i]=-1; } s[v]=1; dist[v]=0; for(i=0;i<numV;i++) {
float min=MAXweight; int u=v; for(int j=0;j<numV;j++)
if(!s[j]&&dist[j]<min) {
u=j; min=dist[j]; } s[u]=1; for(int w=0;w<numV;w++)
if(Vertices[i].city==b) v=i;
for( i=0;i<numV;i++) if(Vertices[i].city==c)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

青岛理工大学琴岛学院
设计报告
课题名称:求解最优交通路径
学院:计算机工程系
专业班级:计算机科学与技术
学号:#######
学生:**
指导教师:**
青岛理工大学琴岛学院教务处
2011 年 7 月 7日
图1
B.具体功能实现及相应的弗洛伊德算法
首先,建立查询信息对话框,使用户能够录入需要查询的城市代号,并显示路径长度及最短路径沿途经过的城市。

并相应地添加如下变量int m_v0;int m_v1;int m_lj;CString m_zd;
具体代码如下:
#define MAXV 25 //最大顶点个数
#define INF 32767 //用32767表示∞
//以下定义邻接矩阵类型
typedef struct
{ int no; //顶点编号
char name[10]; //顶点名称
} VertexType; //顶点类型
typedef struct //图的定义
{ int edges[MAXV][MAXV]; //邻接矩阵
int vexnum,arcnum; //顶点数,弧数
VertexType vexs[MAXV]; //存放顶点信息
} MGraph; //图的邻接矩阵类型
1.通过函数CreatUDN()存放城市路径信息,输入顶点之间的路径长度,创建带权图的邻接矩阵。

void CTDialog::CreatUDN()
{
MGraph *g=(MGraph*)malloc(sizeof(MGraph));
int i,j;
for(i=0;i<MAXV;i++) //录入权值,计算存储用
for(j=0;j<MAXV;j++)
{
g->edges[i][j]=INF;
if(i==j)g->edges[i][j]=0; //初始化置任意两城市之间距离为无穷大,即两城市之间没有直接通路
{
if(i!=j)
m_zd="没有路径";
}
else if(x==i&&y==j)
{
m_lj=A[i][j];
CString zfc;
zfc.Format("%d",i); //输出路径上的起点
m_zd+=zfc;
ppath(path,i,j); //输出路径上的中间点
zfc.Format("-->%d",j); //输出路径上的终点
m_zd+=zfc;
}
}
}
4.输出最短路径函数,递归输出从顶点i到j的最短路径中依次经过的顶点,直到path[i][j]=-1,即没有中间顶点为止。

void CTDialog::ppath(int path[][MAXV], int i, int j)
{
int k;
k=path[i][j];
if (k==-1) return;
ppath(path,i,k);
CString zfc;
zfc.Format("-->%d",k);
m_zd+=zfc;
ppath(path,k,j);
}
四.调试分析(调试过程中出现的问题及处理方式)
A.调试出现的界面
1)进入程序弹出查询信息对话框如图2:
图2
2)输入查询信息,显示路径长度及最短路径,如果输入代号不在0~24之内,提示出错。

如图3、图4:
图3 图4
3)查询成功后,可修改城市代号反复查询。

B.出现的问题及解决方式
1)提出问题:地图导入后,起初无法导入正常导入到VC++6.0,而6.0以上的版本可以,后来导入经过调试无法在界面上显示。

分析问题:VC++6.0版本较低,无法支持分辨率较高的图形。

图形无法显示的问题,可能是图形并没有与界面联系起来。

解决方法:在将地图导入之前,将地图的保存为分辨率较低的bmp位图,即可导入到VC++6.0。

界面无法显示,是没有将位图画刷选入。

添加相关函数pDC->BitBlt(nX, nY, bmpInfo.bmWidth,bmpInfo.bmHeight,&dcMemory,0,0,SRCCOPY)即可显示。

2)提出问题:将C语言代码添加到相关函数中,系统无法识别无法编译。

分析问题:应该添加一些C++可以识别的C的相关信息,使之联系起来。

解决方法:包含进相关头文件,即添加#include <stdio.h>、#include<stdlib.h>。

3)提出问题:一开始将主要代码添加到View类中,在对话框接收到参数通过(WPARAM wParam,LPARAM lParam)实现参数的传递,同时却需要在View类中接收和初始化的一些列问题,增加了不必要的麻烦。

分析问题:可以通过其他方式,减少参数传递过程。

解决方法:直接在对话框添加的类TDialog中,添加代码,省去了参数传递的麻烦。

4)提出问题:将课本上的弗洛伊德算法的相关代码添加后,与实际情况不符,课本上的路径都是全部两点之间的,而现实的交通图中是从用户输入的起始点到目的点。

分析问题:在参数传递时传递接收的起始点和目的点,然后只判断这两个点就可以了。

解决方法:修改判断语句,增加可通过的情况,if(x==i&&y==j&&A[i][j]==INF)和if(x==i&&y==j)添加双向的情况。

5)出现问题:将查询后的路径长度和最短路径在地图界面上显示。

通过pDC->Textout()显示。

而输出过程中,需要各个函数的递归实现,通过参数传递,在View中输出,显得不太现实。

在TDialog中输出,添加CDC *pDC后,依然无法显示。

包含入相关头文件#include "最短路径View.h"依然无效。

在相关函数中添加代码CDC *pDC=GetDC();也没有得到想要的显示。

分析问题:在现有知识和自己所能查到资料中,这种方法不便实现,即使实现后,只能查一次,反复查找需要刷新屏幕。

工作量大。

解决方法:在查询对话框中添加路径长度和最短路径的内容,直接在对话框中显示,即可反复查找,又省去了pDC不能使用的麻烦。

6)出现问题:运行程序后,无法弹出对话框。

弹出对话框后,在查询最短路径时,第一次查询正常,而之后的查询最短路径在之前的基础上不断添加。

分析问题:对话框不显示,应该是缺少相关的命令。

而路径出错,应该增加对应的语句使每次查询,显示路径的对话框能过刷新一次。

相关文档
最新文档