1、小组成员任务分工:项目基本框架设计、项目工程中“4.cpp”文件“main.cpp”文件和“structure.h”文件 、后期的调试工作、PPT制作。项目工程中的“3.cpp”文件、课外实践报告。项目工程中的“2.cpp”文件。项目工程中的“1.cpp”文件。一、问题描述及分析在旅游景区,经常会遇到游客打听从一个景点到另一个景点的最短路径和最短距离,这类游客不喜欢按照导游图的线路来游览,而是挑选自己感兴趣的景点游览。为于帮助这类游客信息查询,就需要计算出所有景点之间最短路径和最短距离。算法采用迪杰斯特拉算法或弗洛伊德算法均可。建立一个景区旅游信息管理系统,实现的主要功能包括制订旅游景点导游线
2、路策略和制订景区道路铺设策略。任务中景点分布是一个无向带权连通图,图中边的权值是景点之间的距离。 (1)景区旅游信息管理系统中制订旅游景点导游线路策略,首先通过遍历景点,给出一个入口景点,建立一个导游线路图,导游线路图用有向图表示。遍历采用深度优先策略,这也比较符合游客心理。 (2)为了使导游线路图能够优化,可通过拓朴排序判断图中有无回路,若有回路,则打印输出回路中的景点,供人工优化。 (3)在导游线路图中,还为一些不愿按线路走的游客提供信息服务,比如从一个景点到另一个景点的最短路径和最短距离。在本线路图中将输出任意景点间的最短路径和最短距离。 (4)在景区建设中,道路建设是其中一个重要内容。
3、道路建设首先要保证能连通所有景点,但又要花最小的代价,可以通过求最小生成树来解决这个问题。本任务中假设修建道路的代价只与它的里程相关。因此归纳起来,本任务有如下功能模块:创建景区景点分布图;输出景区景点分布图(邻接矩阵)输出导游线路图;判断导游线路图有无回路;求两个景点间的最短路径和最短距离;输出道路修建规划图。主程序用菜单选项供用户选择功能模块。二、功能模块及结构描述1.结构: *图的邻接表存储结构*typedef struct ArcNode int adjvex;/该弧所指向的顶点的位置; int weight;/弧长度 struct ArcNode*nextarc; /指向下一条弧的指
4、针;ArcNode;typedef struct VNode VertexType data; /顶点信息 ArcNode *firstarc; /指向第一条依附该顶点的弧的指针VNode,*AdjList;typedef struct AdjList vertices; int vexnum,arcnum; /图的当前顶点数和弧数;ALGraph;/*end*/*图的邻接矩阵存储结构*typedef char VertexType; VertexType*vexs; /顶点向量; int*arcs; /邻接矩阵/存储对应的长度MGraph;/*end*/*十字链表存储结构*typedef s
5、truct ArcBox int tailvex,headvex; /该弧的尾和头顶点的位置 /该弧的长度; struct ArcBox *hlink,*tlink; /分别为弧头相同和弧尾相同的弧的链域ArcBox;typedef struct VexNode ArcBox *firstin,*firstout;/分别指向该顶点的第一条入弧和出弧VexNode;typedef struct VexNode *xlist; /表头向量 /当前顶点数和边数;OLGraph;/*end*/*求导游线路所用的结构(双向链表)*struct guideNode int adj; guideNode*n
6、ext;/指向节点后继 guideNode*prior;/指向节点前驱;2.功能模块:/*求导游线路图*void guideGraph(ALGraph&G,OLGraph&OG,guideNode*&H);/*创建有向图的十字链表*void createOLGraph(OLGraph&ag);/*创建图的邻接表存储结构*void createALGraph(ALGraph&/#/*转换成邻接矩阵*void transition(ALGraph&ag,MGraph&mg);/*输出邻接矩阵*void printMGraph(MGraph mg);/*确定该顶点在十字链表结构中顶点向量的位置*in
7、t LocateOLGraphGraph(OLGraph&ag,VertexType d);/*确定该节点在邻接表结构中顶点向量中的位置*int LocateVexALGraph(ALGraph&/*确定该节点在邻接矩阵结构中顶点向量中的位置*int LocateVexMGraph(MGraph&mg,VertexType d);/#/*深度优先遍历*void DFSTraverse(const ALGraph&G);/*从第v个顶点出发递归地深度优先遍历图G*void DFS(const ALGraph&G,int v);/*拓扑排序*int TopologicalSort(const OL
8、Graph&/*Floyd算法*void ShortestPath_FLOYD(ALGraph&G,int *&path,int *&d);/*还原最短路径(非递归算法)*void explainPath(int*path,int i,int j,int *S,int &top);/从i到j的路径/*输出路径及长度*void printPath(ALGraph&G,int *path,int *d);/*最小生成树(普利姆算法)*/辅助结构typedef struct VertexType adjvex; int lowcost;Closedeg,*CLOSEDEG;/*求出下一条最短的边*i
9、nt minimum(CLOSEDEG closedeg);/*输出最小生产树的各条边*void MiniSpanTree_PRIM( ALGraph&G,VertexType u);三、主要流程描述四、使用说明程序运行后,进入界面:备注:需按从1 到7的持续执行,因各模块不独立.在如上所示的界面下进行基本的操作。五、问题及解决方法问题:调试时数据录入问题 解决方法:使用文件保存图的信息 邻接表转换成矩阵时,那些在邻接表中体现不出的边如何赋值?创建邻接矩阵时,全部元素先初始化为0,在邻接表中能体现的 边赋值为相应的长度,而其余还为0 深度优先遍历时,如何保存遍历路径?用全局变量. (4)如何完
10、成从深度优先遍历序列到导游线路的转换?解决方法:开始时按”学生课外实践题目”中提供的算法设计,发现无法解决复杂的情况,”实践题目”中的算法是让p在深度优先遍历序列中回溯,我们用双向链表存储导游线路,并且让p在为完成的导游线路中回溯即可解决,在ppt中有详细解释. (5)在拓扑排序中如何统计各顶点入度? 解决方法:用图的十字链表存储结构. (6)在弗洛伊德算法中如何还原路径?用二维数组存储路径,使用非递归算法实现还原.六、课外实践总结1、通过课外实践使我们在巩固了原有的理论知识上,又培养了灵活运用和组合集成所学过知识及技能来分析、解决实际问题的能力,使我们体会到自身知识和能力在实际中的应用和发挥
11、。其次,它激发了我们创新意识,开发创造的能力和培养沟通能力。2、这次课外实践设计让我们受益匪浅。我们不仅学到了很多知识和技能,更重要的是我们学会了如何运用所学知识去解决实际问题。在完成实践报告的过程中,遇到一些困难,但经过共同努力,仔细研读教材和相关资料(网络),最终解决.既学到知识,我们也体会到了团队合作的重要性,锻炼了团队协作的意识,以及不怕困难,不惧失败的精神。3、通过这次课外实践,我们深刻的认识到了自己在学习方面的不足之处,但我们也认识到,要学好一门学科,没有刻苦钻研的精神是不行的,只有在不断的尝试中,经历失败,从失败中总结经验,然后再不断的尝试,才能获得成功。七、源代码“struct
12、ure.h”文件:#ifndef structre_h_h#define structre_h_h#includefstreamusing namespace std;#define MAX 10000/*图的邻接表存储结构*/#/#/*end*/#endif“ 1.cpp”文件#includestructure.h/*创建图的邻接表存储结构*ag) ifstream fin(test.txt,ios:in); if(fin=NULL) coutvnumanum;/输入顶点数,边数,和是否有信息的判断信息 ag.vexnum=vnum; ag.arcnum=anum; ag.vertices=
13、new VNodevnum;/开辟空间,存储顶点信息 for(i=0;iag.verticesi.data;/输入顶点信息 VertexType d1,d2; ArcNode *p;d1d2weight; m=LocateVexALGraph(ag,d1);/确定d1在顶点向量中的位置 n=LocateVexALGraph(ag,d2);/确定d2在顶点向量中的位置 p=new ArcNode;/开辟空间,存储边的信息 p-adjvex=m;weight=weight; /把该边链入邻接表nextarc=ag.verticesn.firstarc; ag.verticesn.firstarc=p;adjvex=n; /把对应的边链入邻接表nextarc=ag.verticesm.firstarc; ag.verticesm.firstarc=p; cout邻接表:ag
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1