图 - 图的遍历 - 深度优先遍历(一)
图的遍历概念
图的遍历
和树的遍历类似 图的遍历也是从某个顶点出发 沿着某条搜索路径对图中每个顶点各做一次且仅做一次访问 它是许多图的算
法的基础
深度优先遍历和广度优先遍历是最为重要的两种遍历图的方法 它们对无向图和有向图均适用
注意
以下假定遍历过程中访问顶点的操作是简单地输出顶点
布尔向量visited[ n ]的设置
图中任一顶点都可能和其它顶点相邻接 在访问了某顶点之后 又可能顺着某条回路又回到了该顶点 为了避免重复访问同一个
顶点 必须记住每个已访问的顶点 为此 可设一布尔向量visited[ n ] 其初值为假 一旦访问了顶点V i 之后 便将
visited[i]置为真
深度优先遍历(Depth First Traversal)
图的深度优先遍历的递归定义
假设给定图G的初态是所有顶点均未曾访问过 在G中任选一顶点v为初始出发点(源点) 则深度优先遍历可定义如下 首先访问出
发点v 并将其标记为已访问过;然后依次从v出发搜索v的每个邻接点w 若w未曾访问过 则以w为新的出发点继续进行深度优先遍历
直至图中所有和源点v有路径相通的顶点(亦称为从源点可达的顶点)均已被访问为止 若此时图中仍有未访问的顶点 则另选一个
尚未访问的顶点作为新的源点重复上述过程 直至图中所有顶点均已被访问为止
图的深度优先遍历类似于树的前序遍历 采用的搜索方法的特点是尽可能先对纵深方向进行搜索 这种搜索方法称为深度优先搜
索(Depth First Search) 相应地 用此方法遍历图就很自然地称之为图的深度优先遍历
深度优先搜索的过程
设x是当前被访问顶点 在对x做过访问标记后 选择一条从x出发的未检测过的边(x y) 若发现顶点y已访问过 则重新选择另
一条从x出发的未检测过的边 否则沿边(x y)到达未曾访问过的y 对y访问并将其标记为已访问过;然后从y开始搜索 直到搜索
完从y出发的所有路径 即访问完所有从y出发可达的顶点之后 才回溯到顶点x 并且再选择一条从x出发的未检测过的边 上述过程
直至从x出发的所有边都已检测过为止 此时 若x不是源点 则回溯到在x之前被访问过的顶点;否则图中所有和源点有路径相通的
顶点(即从源点可达的所有顶点)都已被访问过 若图G是连通图 则遍历过程结束 否则继续选择一个尚未被访问的顶点作为新源点
lishixinzhi/Article/program/sjjg/201311/23840