《数据结构课程设计》最短路径问题实验报告.docx
- 文档编号:7976856
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:14
- 大小:176.51KB
《数据结构课程设计》最短路径问题实验报告.docx
《《数据结构课程设计》最短路径问题实验报告.docx》由会员分享,可在线阅读,更多相关《《数据结构课程设计》最短路径问题实验报告.docx(14页珍藏版)》请在冰豆网上搜索。
《数据结构课程设计》最短路径问题实验报告
一、概述ﻩ1
二、系统分析1
三、概要设计ﻩ2
四、详细设计5
4、2单源最短路径6
4、3任意一对顶点之间得最短路径ﻩ7
五、运行与测试8
参考文献11
附录ﻩ12
交通咨询系统设计(最短路径问题)
一、概述
在交通网络日益发达得今天,针对人们关心得各种问题,利用计算机建立一个交通咨询系统。
在系统中采用图来构造各个城市之间得联系,图中顶点表示城市,边表示各个城市之间得交通关系,所带权值为两个城市间得耗费。
这个交通咨询系统可以回答旅客提出得各种问题,例如:
如何选择一条路径使得从A城到B城途中中转次数最少;如何选择一条路径使得从A城到B城里程最短;如何选择一条路径使得从A城到B城花费最低等等得一系列问题。
二、系统分析
设计一个交通咨询系统,能咨询从任何一个城市顶点到另一城市顶点之间得最短路径(里程)、最低花费或就是最少时间等问题。
对于不同得咨询要求,可输入城市间得路程、所需时间或就是所需费用等信息。
针对最短路径问题,在本系统中采用图得相关知识,以解决在实际情况中得最短路径问题,本系统中包括了建立图得存储结构、单源最短问题、对任意一对顶点间最短路径问题三个问题,这对以上几个问题采用了迪杰斯特拉算法与弗洛伊德算法。
并未本系统设置一人性化得系统提示菜单,方便使用者得使用。
三、概要设计
可以将该系统大致分为三个部分:
1 建立交通网络图得存储结构;
2 解决单源最短路径问题;
3 实现两个城市顶点之间得最短路径问题。
迪杰斯特拉算法流图:
弗洛伊德算法流图:
四、详细设计
4、1建立图得存储结构
定义交通图得存储结构。
邻接矩阵就是表示图形中顶点之间相邻关系得矩阵。
设G=(V,E)就是具有n个顶点得图,则G得邻接矩阵就是具有如下定义得n阶方阵。
注:
一个图得邻接矩阵表示就是唯一得!
其表示需要用一个二维数组存储顶点之间相邻关系得邻接矩阵并且还需要用一个具有n个元素得一维数组来存储顶点信息(下标为i得元素存储顶点得信息).
邻接矩阵得存储结构:
#defineMVNum100//最大顶点数
typedef struct
{
VertexType vexs[MVNum];//顶点数组,类型假定为char型
Adjmatrixarcs[MVNum][MVNum];//邻接矩阵,假定为int型
}MGraph;
注:
由于有向图得邻接矩阵就是不对称得,故程序运行时只需要输入所有有向边及其权值即可。
4、2单源最短路径
单源最短路径问题:
已知有向图(带权),期望找出从某个源点S∈V到G中其余各顶点得最短路径。
迪杰斯特拉算法即按路径长度递增产生诸顶点得最短路径算法。
算法思想:
设有向图G=(V,E),其中V={1,2,……n},cost就是表示G得邻接矩阵,
cost[i][j]表示有向边<i,j>得权.若不存在有向边
数组dist记录从源点到其它各顶点当前得最短距离,其初值为dist[i]=cost[i][j],i=2,……n。
从S之外得顶点集合V—S中选出一个顶点w,使dist[w]得值最小。
于就是从源点到达w只通过S中得顶点,把w加入集合S中,调整dist中记录得从源点到V-S中每个顶点v得距离:
从原来得dist[v]与dist[w]+cost[w][v]中选择较小得值作为新得dist[v]。
重复上述过程,直到S中包含V中其余顶点得最短路径.
最终结果就是:
S记录了从源点到该顶点存在最短路径得顶点集合,数组dist记录了从源点到V中其余各顶点之间得最短路径,path就是最短路径得路径数组,其中path[i]表示从源点到顶点i之间得最短路径得前驱顶点。
4、3任意一对顶点之间得最短路径
任意顶点对之间得最短路径问题,就是对于给定得有向网络图G=(V,E),要对G中任意一对顶点有序对,“V,W(V≠W)”,找出V到W得最短路径.而要解决这个问题,可以依次把有向网络图中每个顶点作为源点,重复执行前面得迪杰斯特拉算法n次,即可求得每对之间得最短路径.
费洛伊德算法得基本思想:
假设求从Vi到Vj得最短路径.如果存在一条长度为arcs[i][j]得路径,该路径不一定就是最短路径,还需要进行n次试探。
首先考虑路径
其次,考虑从vi到vj就是否包含有顶点v2为中间顶点得路径<vi,…,v2,…,vj〉,若没有,则说明从vi到vj得当前最短路径就就是前一步求出得;若有,那么〈vi,…,v2,…,vj>可分解为 将该长度与前一次中求得得从vi到vj得中间顶点序号不大于1得最短路径比较,取其长度较短者作为当前求得得从vi到vj得中间顶点序号不大于2得最短路径。 依此类推……直至顶点vn加入当前从vi到vj得最短路径后,选出从vi到vj得中间顶点序号不大于n得最短路径为止.由于图G中顶点序号不大于n,所以vi到vj得中间顶点序号不大于n得最短路径,已考虑了所有顶点作为中间顶点得可能性,因此,它就就是vi到vj得最短路径。 五、运行与测试 测试实例1: 利用如下图所示得有向图来测试 测试实例2: 利用下图求交通网络图(无向图)得最短路径. 实例1运行结果: 实例2运行结果: 六、总结与心得 该课程设计主要就是从日常生活中经常遇到得交通网络问题入手,进而利用计算机去建立一个交通咨询系统,以处理与解决旅客们关心得各种问题(当然此次试验最终主要解决得问题就是: 最短路径问题)。 这次试验中我深刻得了解到了树在计算机中得应用就是如何得神奇与灵活,对于很多得问题我们可以通过树得相关知识来解决,特别就是在解决最短路径问题中,显得尤为重要。 经过着次实验,我了解到了关于树得有关算法,如: 迪杰斯特拉算法、弗洛伊德算法等,对树得学习有了一个更深得了解。 参考文献 【1】《数据结构》严蔚敏、清华大学出版社、 【2】《数据结构课程设计》苏仕华、极械工业出版社、 附录 #include<stdio、h> #include〈stdlib、h> #defineMVNum100 #define Maxint 32767 enum boolean{FALSE,TRUE}; typedefcharVertexType; typedefintAdjmatrix; typedefstruct{ ﻩVertexTypevexs[MVNum]; ﻩAdjmatrix arcs[MVNum][MVNum]; }MGraph; intD1[MVNum],p1[MVNum]; intD[MVNum][MVNum],p[MVNum][MVNum]; voidCreateMGraph(MGraph *G,int n,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条边得i、j及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,int v1,intn) { intD2[MVNum],p2[MVNum]; ﻩint v,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; else ﻩp2[v]=0; ﻩ} ﻩD2[v1]=0;S[v1]=TRUE; ﻩfor(i=2;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; ﻩﻩﻩ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]〈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]); ﻩ} ﻩﻩ} else ﻩﻩ if(xz==1) ﻩﻩﻩﻩprintf(”求单源路径,输入源点v : "); ﻩﻩscanf("%d",&v); ﻩﻩﻩDijkstra(G,v,n); ﻩ} printf("结束求最短路径,再见! \n”); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构课程设计 数据结构 课程设计 路径 问题 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)