深度优先搜索

本文详细介绍了深度优先搜索(DFS)的相关理论,包括注意事项、伪代码和性质,并探讨了其在拓扑排序和强连通分量等领域的应用。在DFS的实现中,需要注意避免死循环和重复搜索,伪代码展示了如何进行DFS遍历。拓扑排序是DFS的一个典型应用,而强连通分量的计算则利用了DFS的特点和图的转置。
摘要由CSDN通过智能技术生成

一、注意事项

实现方法可分为递归和非递归。这里主要想说明一些注意事项。1.在实现图的深度优先遍历时搜索节点的顺序每次必须固定,回溯到某一点后会按照这个固定的顺序继续搜索当时还未搜索的节点,否则会因重复搜索相同的节点造成死循环。另外,为了避免出现环的重复搜索,需要记录已经搜索过的节点。2.在采用非递归方式实现深度优先遍历时,尤其值得注意的是需要记录每个节点当前搜索到的节点,下次回溯到此节点时,会从该处继续搜索,从而避免重复搜索相同节点。

还有一点就是关于搜索遍历的区别,这在上一篇文章中也已经提到了。注意图既可以是有向图,又可以是无向图。既可以是连通图,也可以是非连通。既可以用邻接表表示,又可以用邻接矩阵表示。


用数组模拟栈实现图的深度优先遍历可以参考之后的另一篇博客《Ford-Fulkerson算法 java实现》中的dfs函数

二、理论

2.1.伪代码

输入图既可以是有向图也可以是无向图.time是一个全局变量,用来计算时间戳。

DFS(G)

for each vertex u in G.v

      u.color = WHITE

      u.pi = NIL

time = 0

for each vertex u in G.V

      if u.color == WHITE

            DFS-VISIT(G,u)


DFS-VISIT(G,u)

time = time+1                  // white vertext u has just been discovered

u.d = time                       // u.d是发现时间

u.color = GRAY

for each v in G:Adj[u]      // explore edge (u,v)

      if v.color == WHITE

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值