图的DFS依然和树的DFS思想是一样的。
这是树的DFS文章:
http://blog.csdn.net/karry_zzj/article/details/68951349
记住DFS的核心是递归。
接下来我将对《算法导论》中对于DFS的分析进行概述。
思想:它从某个结点v的出发边开始进行探索,直到该结点的所有出发边都被发现为止,然后”回溯“到前一步的状态即v的前驱结点,继续探索转移到前驱结点的出发边,如此不断重复,直至找到最终的解。
过程:如果在对已被发现的结点u的邻接矩阵或链表进行扫描时,每当发现一个结点v时,将v的前驱属性v.π设置为u。除此之外,还在每个结点上加一个时间戳。每个结点有两个时间戳:第一个v.d记录v第一次被发现的时间,第二个v.f记录搜索完成对v的邻接矩阵或链表扫描的时间。其中u.d < u.f
- 伪代码:
DFS(G)
{
for each vertex u∈G.v
u.color = WHITE
u.π= NIL
time = 0
for each vertex u∈G.v
if u.color == WHITE
DFS-VISIT(G,u)
}
DFS-VISIT(G,u)
{
time = time + 1
u.d = time
u.color = GRAY
for each u∈G:Adj[u]
if v.color == WHITE
v.π= u
DFS-VISIT(G,v)
u.color = BLACK
time = time + 1
u.f = time
}