深度优先搜索
深度优先搜索(Depth-First Search,DFS)选取下一顶点的策略,优先选取最后一个被访问到的顶点的邻居,也可以理解为一路走到底。
实现
在每一个递归实例中,先将前节点v标记为(DISCOVERED)状态,在逐一对它的邻居做处理。待所有邻居均已处理完毕,将顶点v设置为VISITED的状态,便可以回溯。
若顶点u处于(UNDISCOVERED)的状态,则将边(v,u)归类为树边(tree edge)。若顶点u处于DISCOVERED状态,则意味着此处有一个有向环路。此时,在DFS遍历树中u必为v的祖先,所有将(v,u)归类为后向边(back edge)。
每个顶点都记录被发现和访问完成的时刻,对应的时间区间[dTime(v),fTime(v)]均称作v的活跃期(active duration)。任意顶点v和u之间是否存在祖先/后代的"血缘"关系,完全取决于二者的活跃期是否相互包含。
对于有向图,顶点u还可能处于VISITED状态。此时,只要对比v与u的活跃期,即可判定在DFS树中v是否为u的祖先。若是,则边(v,u)归类为前向边(forward edge),否则,二者必然来自相互独立的两个分支,边(v,u)应归类为跨边(cross edge)。
与BFS搜索一样,此时若还有其它的连通或者可达分量,则可以其中任何顶点为基点,再次启动DFS搜索。
经各次DFS搜素生成的一系列DFS树,构成了DFS森林(DFS forest)。
以上图时间为横坐标,绘出下面的图中DFS树内各顶点的活跃期,在DFS树中都是"祖先-后代"关系。
空间复杂度
时间复杂度