一、注意事项
实现方法可分为递归和非递归。这里主要想说明一些注意事项。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