深度优先遍历的递归算法详解:从顶点出发探索无向图

需积分: 10 1 下载量 170 浏览量 更新于2024-07-12 收藏 2.73MB PPT 举报
深度优先遍历(DFS)是一种用于遍历或搜索树和图的算法,特别适用于寻找连通分量、路径等应用场景。从给定的代码片段来看,这个递归函数`DFS(Graph G, int v)`用于执行深度优先遍历,其核心逻辑是从指定顶点`v`开始,首先标记`v`已访问并设置`visited[v]`为`TRUE`。接着,函数会遍历`v`的所有未访问的邻接顶点`w`,通过`FisrtAdjVertex(G, v)`获取`v`的第一个邻接点,并在每个邻接点上递归地调用`DFS`函数。 在讨论深度优先遍历之前,先回顾一下图的基本概念: 1. 图的定义与术语: - **图**(Graph):由顶点集`V(G)`和边集`E(G)`组成,通常表示为`G = (V, E)`。其中,`V`是非空有限集,而`E`可以是无向边或有向边的集合。 - **有向图**:有方向的边,记作有序对 `<v, w>`,其中`v`是尾部,`w`是头部,且`<v, w>`不等于`<w, v>`。 - **无向图**:边是无序对 `(v, w)`或`(w, v)`,并且`<v, w>`等于`<w, v>`,顶点间的边没有方向性。 - **有向完全图**:所有顶点之间存在双向的有向边。 - **无向完全图**:所有顶点之间恰好有一条直接边相连。 - **权值**:与图中的边或弧关联的数值,它可能代表特定的实际意义,如距离、时间等。 - **网**:带权的图,权值可用于表示不同边或弧之间的具体属性。 在实际问题中,例如城市交通网络,权值可以用来表示道路的长度、交通流量等级,而在工程进度图中,权值则可能表示任务之间的依赖关系或持续时间。 举例来说,图G1和G2展示了有向和无向图的实例,它们分别定义了顶点和边的集合,以及边的表示方式。在`DFS`的实现中,`FisrtAdjVertex(G, v)`和`NextAdjVertex(G, v, w)`可能是辅助函数,用于查找当前顶点`v`的下一个邻接顶点。 在执行深度优先遍历时,递归调用的过程确保了首先探索尽可能深的分支,直到遇到一个未访问的节点,然后回溯到其他分支。这种遍历方式特别适合解决连通性问题,如找出图中是否存在从一个顶点到另一个顶点的路径,或者找出连通分量。 总结来说,从某个顶点`v`开始的深度优先遍历递归算法的核心在于利用顶点的邻接列表或邻接矩阵,通过不断遍历未访问的顶点,同时维护一个已访问状态的标志数组,确保遍历过程不会重复。这是一种重要的图算法基础,对于理解和解决许多图论问题至关重要。