- 1、本文档共29页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构课程设计图遍历
图的遍历原理总述图的遍历:从图中某一顶点出发访遍图中其余顶点,且使得每一个顶点仅被访问一次。这一过程就叫做图的遍历。深度优先遍历深度优先遍历类似于树的先根遍历,是树的先根遍历的推广。假如初始状态是图中所有顶点未曾被访问,则深度优先遍历可从图中某个顶点V出发,访问此顶点,然后依次从V的未被访问的邻接点出发深度优先遍历图,直到图中所有和V有路径相通的顶点都被访问到;若图中此时尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直到图中所有顶点都被访问到为止。以图1.1为例,假如从顶点V1出发进行搜索,在访问了顶点V1之后,选择邻接点V2。因为V2未曾访问,则从V2出发进行搜索。以此类推,接着从V4,V8,V5出发进行搜索。在访问了V5之后,由于V5的邻接点都已被访问,则搜索回到V8。由于同样的理由,搜索回到V4,V2直到V1,此时由于V1的另一个邻接点未被访问,则搜索又从V1到V3,再继续进行下去。由此,得到的顶点访问序列为:V1—V2—V4—V8—V5—V3—V6—V7广度优先遍历广度优先遍历类似于树的按层次遍历的过程。假如从图中某顶点V出发,在访问了V之后依次访问V的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问,直到图中所有已被访问的顶点的邻接点都被访问到。若图中此时尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直到图中所有顶点都被访问到为止。以图1.1为例,首先访问V1和V1的邻接点V2和V3,然后依次访问V2的邻接点V4和V5及V3的邻接点V6和V7,最后访问V4的邻接点V8。由于这些顶点的邻接点均已被访问,并且图中所有顶点都被访问,由此完成图的遍历。得到的顶点访问序列为:V1—V2—V3—V4—V5—V6—V7—V8需求分析要求设计类(或类模板)来描述图,包含必要的构造函数和析构函数,以及其他能够完成如下功能的成员函数:输入图、输出图求图中顶点V的第一个邻接点求图中顶点V的下一个邻接点深度优先遍历图广度优先遍历图并设计主函数测试该类(或类模板)。第三章总体设计3.1程序设计思路本系统有六个基本功能:输入图,输出图,求图中顶点V的第一个邻接点,求图中顶点V的下一个邻接点,深度优先遍历图,广度优先遍历图。输入图:首先需输入顶点数及边数,然后根据顶点数确定矩阵大小,再根据边数输入对应的两点及权值。输出图:先输出有所有边及对应的权值,再输出矩阵。求图中顶点V的第一个邻接点:通过输入顶点v就可以输出其第一个邻接点。求图中顶点V的下一个邻接点:通过输入顶点v及另一点,就可以从该位置的下一个位置开始,找到顶点V的下一个邻接点。深度优先遍历图:由1.1所述可知,图的深度优先遍历显然是一个递归的过程。为了在遍历过程中便于区分顶点是否被访问过,需要附设一个访问标志数组,其初始值为false,一旦某个顶点被访问,则将其相应的分量置为true。广度优先遍历图:由1.2所述可知,和深度优先遍历类似,在广度优先遍历的过程中也需要一个访问标志数组。并且为了顺次访问路径长度为2,3,……的顶点,需要附设队列以存储已被访问的路径长度为1,2,……的顶点。3.2 功能视图本程序主要包含六个功能,即图的创建,输出,访问顶点V的第一个和下一个邻接点,以及深搜和广搜。其功能视图如图2.1所示。图3.1功能视图第四章类的设计4.1 GraphUDN类的设计GraphUDN类包括:1.私有的数据成员,其中有顶点访问标志,顶点集,邻接矩阵,顶点数就边数 2.公有的成员函数,其中有创建输出图,输出顶点V的第一个和下一个邻接点,以及深搜和广搜。具体见以下程序段:classGraphUDN {public:GraphUDN ();void create();//创建图void showGraph();//输出图intfirstAdjvex(int v);//输出v的第一个邻接顶点intnextAdjvex(int v, int w);//输出下一个邻接顶点void dfsTravel();//深度优先遍历voiddfs(int v);void bfsTravel();//广度优先遍历private:bool visited[MAX_VERTEX_NUM];//顶点访问标志intvexs[MAX_VERTEX_NUM];//顶点集int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵intvexNum;intarcNum;};4.2 Queue类的设计Queue类作为一个辅助的功能类,主要包括入队,出队及队列的判空。具体如下:class Queue {public:Queue (){for(inti
文档评论(0)