校园导航问题_第1页
校园导航问题_第2页
校园导航问题_第3页
校园导航问题_第4页
校园导航问题_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、实验七 校园导航问题 一需求分析设计你的学校的平面图,至少包括10个以上的景点(场所),每两个景点间可以有不同的路,且路长也可能不同,找出从任意景点到达另一景点的最佳路径(最短路径)。要求:(1)以图中顶点表示校园内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等有关信息。(2)为来访客人提供图中任意景点相关信息的查询。(3)为来访客人提供任意景点的问路查询,即查询任意两个景点之间的一条最短路径。(4)修改景点信息。实现提示:一般情况下,校园的道路是双向通行的,可设计校园平面图是一个无向网。顶点和边均含有相关信息。二设计2.1 设计思想(1)数据结构设计(包括逻辑结构设计和

2、存储结构设计)1. 创建有向图G,在空图G中插入n个顶点和e条边。并实现最短路径算法。2. 定义邻接矩阵实现图的存储类型定义。用来保存景点的数据信息,如景点间的距离。3. 定义结构体数组实现景点信息的保存,如景点名称等(2)算法设计1.根据景点信息建立临接矩阵2.调用Dijkstra求出两景点的最短路径3.建立结构体数组存储数据4.将修改的信息直接写入数组中2.2 设计表示(1)函数调用关系图 主函数main()依次调用以下个函数#include AdjMGraph.h#include Dijkstra.h(2)函数接口规格说明调用库函数为#include #include #include

3、调用自定义函数为#include AdjMGraph.h#include Dijkstra.h 各函数说明void ListInitiate(SeqList *L) /* 初始化顺序表L*/int ListLength(SeqList L) /* 返回顺序表L的当前数据元素个数*/int ListInsert(SeqList *L, int i, DataType x)int ListDelete(SeqList *L, int i, DataType *x)/*删除顺序表L中位置为i(0 = i = size-1)的数据元素并存放到x中*/*删除成功返回1,删除失败返回0*/int List

4、Get(SeqList L, int i, DataType *x)/*取顺序表L中第i个数据元素存于x中,成功返回1,失败返回0*/void Dijkstra(AdjMGraph G,int v0,int distance,int path) 最短路径算法/置带权有向图G为空图void GraphInitiate(AdjMGraph *G)/判断顶点vertex是否是有向图G的顶点,是则返回顶点在顶点顺序表中的序号,否则返回-1。int IsVertex(AdjMGraph *G,DataType vertex)/在带权有向图G中插入顶点vertex。如果图中已经有顶点vertex,则图不变

5、void InsertVertex(AdjMGraph *G,DataType vertex)/* 在带权有向图G中插入一条第v1个顶点指向第v2个顶点,权值为weight的有向边。 * 如果v1和v2有一个不是图中的顶点,则图不变;如果v1和v2相等,则图不变。 * 如果图已经包含该边,则边的权值更改为新的权值,时间复杂度:O(1)。 */void InsertEdge(AdjMGraph *G,int v1,int v2,int weight)/判断第v1个顶点到第v2个顶点的边是否是有向图G的边,是则返回1,否则返回0.时间复杂度O(1)。int IsEdge(AdjMGraph *G,

6、int v1,int v2)/* 在带权有向图G中删除一条第v1个顶点指向第v2个顶点的有向边。 * 如果v1和v2有一个不是图中的顶点,则图不变;如果v1和v2相等,则图不变。 * 如果不是图的边,则图不变。时间复杂度:O(1)。 */void DeleteEdge(AdjMGraph *G,int v1,int v2)/在带权有向图G中取第v个顶点的第一个邻接顶点,如果这样的邻接顶点存在,则返回该顶点在顶点顺序表的序号,否则返回-1.时间复杂度:O(n)。int GetFirstVex(AdjMGraph G,int v)/创建有向图G,通过在空图G中插入n个顶点和e条边实现。时间复杂度:

7、O(n2+e)。void GraphCreat(AdjMGraph *G,DataType v,int n,RowColWeight W,int e)2.3 详细设计(1)数据结构设计(包括逻辑结构设计和存储结构设计) (2)算法设计基本数据结构为:typedef structDataType listMaxSize ;int size ;SeqList;/初始化顺序表void ListInitiate(SeqList *L) /* 初始化顺序表L*/L-size = 0;int ListLength(SeqList L) /* 返回顺序表L的当前数据元素个数*/return L.size;i

8、nt ListInsert(SeqList *L, int i, DataType x)/* 在顺序表L的第i(0 size = MaxSize)printf(顺序表已满无法插入!n);return 0;else if(i L-size)printf(参数i不合法!n);return 0;else/*为插入做准备*/for(j = L-size; j i; j-)L-listj = L-listj-1;L-listi = x;L-size+; /元素个数加1return 1;int ListDelete(SeqList *L, int i, DataType *x)/*删除顺序表L中位置为i(

9、0 size = 0)printf(顺序表已空无数据元素可删!n);return 0;else if(i L-size-1 )printf(参数i不合法!n);return 0 ;else*x = L-listi; /*保存删除的元素到x中*/*依次前移*/for(j = i+1; j size-1; j+)L-listj-1 = L-listj;L-size-; /元素个数减1return 1;int ListGet(SeqList L, int i, DataType *x)/*取顺序表L中第i个数据元素存于x中,成功返回1,失败返回0*/if(i L.size-1)printf(参数i不

10、合法!n);return 0;else*x = L.listi;return 1;基本函数为Dijkstra算法 算法具体步骤(1)初始时,S只包含源点,即S=,v的距离为0。U包含除v外的其他顶点,U中顶点u距离为边上的权(若v与u有边)或 )(若u不是v的出边邻接点)。(2)从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。(3)以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u(u U)的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。(4)重复步骤(2)和(3)直到所有顶

11、点都包含在S中三调试分析Dijkstra算法思想为:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将 加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为

12、中间顶点的当前最短路径长度。空间复杂度度Dijkstra 算法的时间复杂度为O(n2) 空间复杂度取决于存储方式,邻接矩阵为O(n2)四用户手册1.首先选择要进行的操作2选1、2、3、4分别为查询景点信息、问路查询、修改景点信息、退出。3.选1 输入景点代号即可进行信息查询。4.选2 输入两景点代号即可进行问路查询。并输出最短路径长度以及两路径的景点。4.选3 输入景点代号即可进行修改。5选4退出五测试数据及测试结果六源程序清单typedef structDataType listMaxSize ;int size ;SeqList;/初始化顺序表void ListInitiate(SeqLi

13、st *L) /* 初始化顺序表L*/L-size = 0;int ListLength(SeqList L) /* 返回顺序表L的当前数据元素个数*/return L.size;int ListInsert(SeqList *L, int i, DataType x)/* 在顺序表L的第i(0 size = MaxSize)printf(顺序表已满无法插入!n);return 0;else if(i L-size)printf(参数i不合法!n);return 0;else/*为插入做准备*/for(j = L-size; j i; j-)L-listj = L-listj-1;L-list

14、i = x;L-size+; /元素个数加1return 1;int ListDelete(SeqList *L, int i, DataType *x)/*删除顺序表L中位置为i(0 size = 0)printf(顺序表已空无数据元素可删!n);return 0;else if(i L-size-1 )printf(参数i不合法!n);return 0 ;else*x = L-listi; /*保存删除的元素到x中*/*依次前移*/for(j = i+1; j size-1; j+)L-listj-1 = L-listj;L-size-; /元素个数减1return 1;int ListG

15、et(SeqList L, int i, DataType *x)/*取顺序表L中第i个数据元素存于x中,成功返回1,失败返回0*/if(i L.size-1)printf(参数i不合法!n);return 0;else*x = L.listi;return 1;#include SeqList.h/邻接矩阵实现图的存储类型定义typedef structSeqList vertices; /存放顶点的顺序表int edgeMaxVerticesMaxVertices; /存放边的邻接矩阵int numOfEdges; /边的数目AdjMGraph;/图的结构体定义typedef struct

16、 int row; /行下标 int col; /列下标 int weight; /权值RowColWeight;/边信息结构体定义struct massageschar name20;int num; int cen; massage10=教一楼,50,7,教二楼,50,7,教三楼,50,7,主楼,50,7,图书馆,50,北一楼,50,7,北二楼,50,7,北三楼,50,7,北综,50,7,北区图书馆,50,7;/置带权有向图G为空图,时间复杂度:O(1)。void GraphInitiate(AdjMGraph *G)int i,j;for(i=0;iMaxVertices;i+)for(

17、j=0;jedgeij=0;else G-edgeij=MaxWeight; /MaxWeight表示权值无穷大G-numOfEdges=0; /边的条数置为0ListInitiate(&G-vertices); /顶点顺序表初始化int IsVertex(AdjMGraph *G,DataType vertex)int i;for (i=0;ivertices.size;i+)if(G-vertices.listi=vertex)break;if (i=G-vertices.size)return -1;elsereturn i;void InsertVertex(AdjMGraph *G,

18、DataType vertex)if(IsVertex(G,vertex)vertices,G-vertices.size,vertex)=0)/在顶点顺序表的表尾插入顶点vertexprintf(插入顶点时空间已满无法插入!);exit(1);void InsertEdge(AdjMGraph *G,int v1,int v2,int weight)DataType x;if(v1!=v2)if(ListGet(G-vertices,v1,&x)=0)|(ListGet(G-vertices,v2,&x)=0)printf(插入边时参数v1和v2越界出错!n);exit(1);G-edgev

19、1v2=weight;G-numOfEdges+;int IsEdge(AdjMGraph *G,int v1,int v2)DataType x;if(ListGet(G-vertices,v1,&x)=0) | (ListGet(G-vertices,v2,&x)=0)printf(边的参数v1和v2越界出错!n);return 0;if(G-edgev1v2 = MaxWeight | v1=v2)printf(该边不存在!n);return 0;return 1;void DeleteEdge(AdjMGraph *G,int v1,int v2)if (IsEdge(G,v1,v2)

20、=0)printf(删除边时出错!);exit(1);elseG-edgev1v2=MaxWeight;G-numOfEdges-;/计算带权有向图G中第v个顶点的入度,时间复杂度:O(n)。int InDegree(AdjMGraph *G,int v)/在此插入你第二步的代码,替换掉下面的语句int din=0,j;for(j=0;jvertices.size;j+)if(G-edgevj!=0&G-edgevj!=MaxWeight)din+;return din;/计算带权有向图G中第v个顶点的出度,时间复杂度:O(n)。int OutDegree(AdjMGraph *G,int v

21、)/在此插入你第二步的代码,替换掉下面的语句int dou=0,j;for(j=0;jvertices.size;j+)if(G-edgejv!=0&G-edgevj!=MaxWeight)dou+;return dou;/计算带权有向图G中第v个顶点的度,时间复杂度:O(n)。int Degree(AdjMGraph *G,int v)return(InDegree(G,v)+OutDegree(G,v);/在带权有向图G中删除第v个顶点,时间复杂度:O(n2)。void DeleteVertex(AdjMGraph *G,int v) /在此插入你第一步的代码int j=0,i;if(vG

22、-vertices.size)printf(参数v出错!n);return;for (j=v;jvertices.size;j+)for (i=0;ivertices.size;i+)G-edgeji=G-edgeji+1;for (j=v;jvertices.size-1;j+)for (i=0;ivertices.size;i+)G-edgeij=G-edgei+1j;for(j=v;jvertices.size-1;j+)G-vertices.listj=G-vertices.listj+1;G-vertices.size-;/在带权有向图G中取第v个顶点的第一个邻接顶点,如果这样的邻接

23、顶点存在,则返回该顶点在顶点顺序表的序号,否则返回-1.时间复杂度:O(n)。int GetFirstVex(AdjMGraph G,int v) int col;DataType x; if(ListGet(G.vertices,v,&x)=0) printf(取第一个邻接顶点时参数v越界出错!n); exit(1);/寻找邻接矩阵v行中从最左开始第一个值非零且非无穷大的权值对应的顶点for(col=0;col0 & G.edgevcol MaxWeight) return col; return -1; /在带权有向图G中取第v1个顶点的继邻接结点第v2个顶点之后的下一个邻接结点,时间复杂

24、度:O(n)。int GetNextVex(AdjMGraph G,int v1,int v2) int col;DataType x; if(ListGet(G.vertices,v1,&x)=0)|(ListGet(G.vertices,v2,&x)=0) printf(取下一邻接顶点时参数v1和v2越界出错!n); exit(1);if(G.edgev1v2=0)printf(v2不是v1的邻接顶点n); exit(1);/寻找邻接矩阵v行中从第v2+1列开始的第一个值非零且非无穷大的权值对应的顶点for(col=v2+1;col0 & G.edgev1colMaxWeight) ret

25、urn col; return -1;/创建有向图G,通过在空图G中插入n个顶点和e条边实现。时间复杂度:O(n2+e)。void GraphCreat(AdjMGraph *G,DataType v,int n,RowColWeight W,int e)int i,k;GraphInitiate(G);for(i=0;in;i+) InsertVertex(G,vi);for(k=0;ke;k+) InsertEdge(G,Wk.row,Wk.col,Wk.weight);void Dijkstra(AdjMGraph G,int v0,int distance,int path)int n

26、=G.vertices.size;int *s=(int *)malloc(sizeof(int)*n);int minDis,i,j,u;for (i=0;in;i+)distancei=G.edgev0i;si=0;if (i!=v0&distanceiMaxWeight)pathi=v0;else pathi=-1;sv0=1;for (i=0;in;i+)minDis=MaxWeight;for (j=0;jn;j+)if (sj=0&distancejminDis)u=j;minDis=distancej;if (minDis=MaxWeight)return;su=1;for (j

27、=0;jn;j+)if (sj=0&G.edgeujMaxWeight&distanceu+G.edgeujdistancej)distancej=distanceu+G.edgeuj;pathj=u; #include #include #include typedef int DataType;#define MaxSize 100#define MaxVertices 15#define MaxWeight 10000#include AdjMGraph.h#include Dijkstra.hvoid main()int p10;int flog=0;AdjMGraph g; int

28、i,j,k,o,l,n=10,e=30,t;int distance10,path10;DataType a=0,1,2,3,4,5,6,7,8,9;RowColWeight rcw=0,3,20,0,4,15,1,2,30,2,1,30,2,3,50,2,4,65,2,7,653,2,8,700,3,0,20,3,2,50,3,4,6,4,0,15,4,2,65,4,3,6,5,6,10,5,9,20,6,5,10,6,7,10,6,9,30,7,2,653,7,6,10,7,8,50,7,9,20,8,2,700,8,7,50,8,9,40,9,5,20,9,6,30,9,7,20,9,8,40;int output(int t);GraphCreat(&g,a,n,rcw,e);Dijkstra(g,0,distance,path);printf(nnntt中国地质大学nn);printf(t一、地图信息nn);printf(t0、教一楼 1、教二楼 2、教三楼 3、主楼 4、图书馆n);printf(nt5、北一楼 6、北二楼 7、北三

温馨提示

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

评论

0/150

提交评论