深度优先搜索

深度优先搜索(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树中都是"祖先-后代"关系。

 

空间复杂度O(n+e)

时间复杂度O(n+e) 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值