《数据结构》-图的遍历_第1页
《数据结构》-图的遍历_第2页
《数据结构》-图的遍历_第3页
《数据结构》-图的遍历_第4页
《数据结构》-图的遍历_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

7.1图的定义和术语,7.2 图的存储结构,7.3 图的遍历,7.4 图的连通性问题,7.5 有向无环图及其应用,7.6 最短路径,7.3 图的遍历,从图中某个顶点出发游历图,访遍图中其余顶点,并且使图中的每个顶点仅被访问一次的过程。 图的遍历算法是求解图的连通性问题、拓朴排序和关键路径等算法的基础。,图的遍历要比树的遍历复杂的多。由于图的任一顶点都可能与其余顶点相邻接,故在访问了某各顶点之后, 可能顺着某条边又访问到已访问过的顶点。例如:对于图7.1的G4,它的每个顶点都与其余三个顶点向邻接。 在访问了v1,v2和v3之后,顺着边(v3,v1)又会访问到v1。因此在遍历图的过程中,必须记下 每个被访问到的顶点,以免同一个顶点被访问多次。为此,对每个顶点引进一个辅助函数visited(w), 用以标志顶点是否被访问过,其初态为零,一旦顶点w被访问过,则visited(w)=1。,深度优先搜索,广度优先搜索,从图中某个顶点V0 出发,访问此顶点,然后依次从V0的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和V0有路径相通的顶点都被访问到。,一、深度优先搜索遍历图,连通图的深度优先搜索遍历,W1、W2和W3 均为 V 的邻接点,SG1、SG2 和 SG3 分别为含顶点W1、W2和W3 的子图。,访问顶点 V ;for (W1、W2、W3 ) 若该邻接点W未被访问, 则从它出发进行深度优先搜索遍历。,从上页的图解可见:,1. 从深度优先搜索遍历连通图的过程类似于树的先根遍历;,解决的办法是:为每个顶点设立一个 “访问标志 visitedw”;,2. 如何判别V的邻接点是否被访问?,用深度优先搜索法遍历图,从v1出发,一种可能的顶点访问顺序为v1,v2,v4,v8,v5,v6, v3,v7。显然,这个遍历过程是一个递归过程。现在来考虑深度优先搜索的递归算法。,void DFS(Graph G, int v) / 从顶点v出发,深度优先搜索遍历连通图 G visitedv = TRUE; VisitFunc(v); for(w=FirstAdjVex(G, v); w!=0; w=NextAdjVex(G,v,w) if (!visitedw) DFS(G, w); / 对v的尚未访问的邻接顶点w / 递归调用DFS / DFS,首先将图中每个顶点的访问标志设为 FALSE, 之后搜索图中每个顶点,如果未被访问,则以该顶点为起始点,进行深度优先搜索遍历,否则继续检查下一顶点。,非连通图的深度优先搜索遍历,void DFSTraverse(Graph G, Status (*Visit)(int v) / 对图 G 作深度优先遍历。 VisitFunc = Visit; for (v=0; vG.vexnum; +v) visitedv = FALSE; / 访问标志数组初始化 for (v=0; vw1, V-w2, V-w8 的路径长度为1;,V-w7, V-w3, V-w5 的路径长度为2;,V-w6, V-w4 的路径长度为3。,w1,V,w2,w7,w6,w3,w8,w5,w4,从图中的某个顶点V0出发,并在访问此顶点之后依次访问V0的所有未被访问过的邻接点,之后按这些顶点被访问的先后次序依次访问它们的邻接点,直至图中所有和V0有路径相通的顶点都被访问到。,若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。,用深广度优先搜索法遍历图,从v1出发,访问v1,再访问v1的邻接点v2、v3,v2、v3进队Q,v1的邻接表访问完;v2出队,访问v2的邻接点v4、v5,于是v4、v5进队,v2的邻接表访问完;v3出队,访问v3的邻接点v6、v7,v6、v7进队,v3的邻接表访问完;v4出队,访问v4的邻接点v8,v8进队,v8的邻接点访问完;接着v5、v6、v7、v8顺序出队,队空,遍历图结束。 于是按宽度优先搜索遍历图G7,从v1出发访问顶点的顺序为 v1,v2,v3,v4,v5,v6,v7,v8,void BFSTraverse(Graph G, Status (*Visit)(int v) for (v=0; vG.vexnum; +v) visitedv = FALSE; /初始化访问标志 InitQueue(Q); / 置空的辅助队列Q for ( v=0; vG.vexnum; +v ) if ( !visitedv) / v 尚未访问 / BFSTraverse, ,visitedv = TRUE; Visit(v); / 访问uEnQueue(Q, v); / v入队列while (!QueueEmpty(Q) DeQueue(Q, u); / 队头元素出队并置为u for(w=FirstAdjVex(G, u); w

温馨提示

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

评论

0/150

提交评论