



免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五章 图。5.3 图的遍历 和树的遍历类似,在此,我们希望从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次。这一过程就叫做图的遍历(TraversingGraph)。图的遍历算法是求解图的连通性问题、拓扑排序和求关键路径等算法的基础。然而,图的遍历要比树的遍历复杂得多。因为图的任一顶点都可能和其余的顶点相邻接。所以在访问了某个顶点之后,可能沿着某条路径搜索之后,又回到该顶点上。例如图7.1(b)中的G2,由于图中存在回路,因此在访问了v1,v2,v3,v4之后,沿着边(v4 , v1)又可访问到v1。为了避免同一顶点被访问多次,在遍历图的过程中,必须记下每个已访问过的顶点。为此,我们可以设一个辅助数组visited0.n-1,它的初始值置为“假”或者零,一旦访问了顶点vi,便置visitedi为“真”或者为被访问时的次序号。 通常有两条遍历图的路径:深度优先搜索和广度优先搜索。它们对无向图和有向图都适用。5.3.1 深度优先搜索 深度优先搜索(Depth-First Search)遍历类似于树的先根遍历,是树的先根遍历的推广。其基本思想如下:假定以图中某个顶点vi为出发点,首先访问出发点,然后选择一个vi的未访问过的邻接点vj,以vj为新的出发点继续进行深度优先搜索,直至图中所有顶点都被访问过。显然,这是一个递归的搜索过程。 现以图5-3-1中G为例说明深度优先搜索过程。假定v0是出发点,首先访问v0。因v0有两个邻接点v1、v2均末被访问过,可以选择v1作为新的出发点,访问v1之后,再找v1的末访问过的邻接点。同v1邻接的有v0、v3和v4,其中v0已被访问过,而v3、v4尚未被访问过,可以选择v3作为新的出发点。重复上述搜索过程,继续依次访问v7、v4 。访问v4之后,由于与v4相邻的顶点均已被访问过,搜索退回到v7。由于v7、v3和v1都是没有末被访问的邻接点,所以搜索过程连续地从v7退回到v3,再退回v1,最后退回到v0。这时再选择v0的末被访问过的邻接点v2,继续往下搜索,依次访问v2、v5和v6,止此图中全部顶点均被访问过。遍历过程见图5-3-1(b),得到的顶点的访问序列为:v0 v1 v3 v7 v4 v2 v5 v7。(a)无向图G (b) G的深度优先搜索过程图5-3-1 深度优先搜索遍历过程示例因为深度优先搜索遍历是递归定义的,故容易写出其递归算法。下面的算法5.3是以邻接矩阵作为图的存储结构下的深度优先搜索遍历算法;算法5.4是以邻接表作为图的存储结构下的深度优先搜索遍历算法。算法5.3int visitedNAX_VEX=0;void Dfs_m( Mgraph *G,int i)/* 从第i个顶点出发深度优先遍历图G,G以邻接矩阵表示*/printf(%3c,G-vexsi);visitedi=1;for (j=0;jarcsij=1)& (!visitedj)Dfs_m(G,j); /*Dfs_m */算法5.4int visitedVEX_NUM=0;void Dfs_L(ALgraph G,int i)/* 从第i个顶点出发深度优先遍历图G,G以邻接表表示 */printf(%3c,Gi.data);visitedi=1;p=Gi.firstarc;while (p!=NULL) if(visitedp-adjvex=0)Dfs_L(G,p-adjvex);p=p-nextarc; /*dfs_L*/分析上述算法得知,遍历图的过程实质上是对每个顶点搜索其邻接点的过程。其耗费的时间取决于所采用的存储结构。假设图有n个顶点,那么,当用邻接矩阵表示图时,搜索一个顶点的所有邻接点需花费的时间为O(n),则从n个顶点出发搜索的时间应为O(n2),所以算法5.1的时间复杂度是O(n2);如果使用邻接表来表示图时,需花费时间为O(n+e), 其中e为无向图中边的数目或有向图中弧的数目。算法5.4的时间复杂度为O(n+e)。 5.3.2 广度优先搜索连通图的广度优先搜索(Breadth_FirstSearch)遍历图类似于树的按层次遍历。其基本思想是:首先访问图中某指定的起始点Vi并将其标记为已访问过,然后由Vi出发访问与它相邻接的所有顶点Vj、 Vk,并均标记为已访问过,然后再按照Vj、Vk的次序,访问每一个顶点的所有未被访问过的邻接顶点,并均标记为已访问过,下一步再从这些顶点出发访问与它们相邻接的尚未被访问的顶点,如此做下去,直到所有的顶点均被访问过为止。在广度优先搜索中,若对顶点V1的访问先于顶点V2的访问,则对V1邻接顶点的访问也先于V2邻接顶点的访问。就是说广度优先搜索中对邻接点的寻找具有“先进先出”的特性。因此,为了保证访问顶点的这种先后关系,需借助一个队列暂存那些刚访问过的顶点。 例如,下面以图5-3-1种G为例说明广度优先搜索的过程。假设从起点v0出发,那么首先访问vo和行动两个未访问的邻接点v1和v2;然后依次访问v1的邻接点v3和v4以及v2的邻接点v5和v6;最后访问v3的未曾访问的邻接点v7。此图中所有顶点均已被访问过,由此完成了图的遍历。遍历过程见图5-3-2,得到的顶点访问序列为: v0v1v2v3v4v5v6v7在广度优先搜索中,若顶点v在顶点u之前访问,则v的邻接点也将在u的邻接点之前访问。由此,可采用对列qu来暂存那些刚访问过并且可能还有未访问的邻接点的顶点。v0V1V3V7V4V2V5V6 图532 广度优先搜索遍历过程 算法5.5 int visitedVEX_NUM=0; void Bfs(Mgraph G,int k) int qu20,f=0,r=0; printf(“%3c”,G.vexsk); visitedk=1; r+;qur=k; while (r!=f) f+;i=quf;for(j=p;jarcsij=1&(!visitecj) printf(“%3c”,G.vexsj); visitedj=I; r+;qur=j; /*Bfs*/分析上述算法,一个有n个顶点、e条边的图,在广度优先搜索图的过程中,每个顶点至多进一次队列
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 生物化学与药物应用测试题
- 阴道分娩考试试题及答案
- 六一儿童节商场活动方案
- 六一咨询活动方案
- 医学公招考试试题及答案
- 六一活动冰棍活动方案
- 六一活动才艺秀活动方案
- 六一活动撒纸屋活动方案
- 六一游船活动方案
- 六一畅游活动方案
- 《生产公司岗位职责》课件
- 部编版语文小升初复习之拼音百题训练(一)
- 《缺血-再灌注损伤》课件
- 加油站安全事故隐患排查治理制度
- 国际法学(山东联盟)知到智慧树章节测试课后答案2024年秋烟台大学
- 面包砖购销合同范例
- 【MOOC】水墨构成-哈尔滨师范大学 中国大学慕课MOOC答案
- 口腔临床药物学题集
- 《城市固体废物填埋场地下水污染风险管控与 原位修复技术指南》(征求意见稿) 编制说明
- 道路工程质量通病防治监理细则
- 《消防应急疏散培训》课件
评论
0/150
提交评论