DFS(G)//以邻接链表形式输入
//v.d第一次访问时 v.f邻接链表访问完时 v.color状态变化,WHITE 为访问;GRAY第一次;BLACK邻接链表访问结束 v.pa父顶点 Adj[v]顶点的邻接链表 time记录以给v.d v.f
<span style="font-family: Arial, Helvetica, sans-serif;">for all v in G </span>
<span style="font-family: Arial, Helvetica, sans-serif;">v.color=WHITE v.d=0 v.f=0 v.pa=NIL </span>
<span style="font-family: Arial, Helvetica, sans-serif;">time=0</span>
for all v in G
if v.color==WHITE DFS-VISIT(G,v)
DFS-VISIT(G,v)
time=time+1
v.color=GRAY v.d=time
for all u in Adj[v]
if u.color==WHITE
u.pa=v
DFS-VISIT(G,u)
time=time+1;u.f=time;u.color=BLACK
分析时空复杂度:V点 E边 DFS中初始化for为O(V);DFS-VISIT 每个顶点访问一次,邻接链表没有未访问顶点则返回父顶点;根顶点也没有则找到另一源为WHITE的顶点
c*V。 对边来说,在for里pa的赋值O(E)。因而O(V+E)
由v.d v.f记录的区间可以得知后代关系。
u是v的后代,当仅当v.d之时,有白色路径从节点u到v。
从DFS的角度对中的边进行分类:后向边(后代指向祖先且有向图的自循环也被认为是后向边),前向边(祖先指向后代),树边(森林中树内部),横向边(其他:有森林中树兄弟指向/树与树之间的节点指向)。有向图四种都可能有.
无向图只可能有两种边:树边和后向边。pr:(v,u) v.d<u.d 则进行访问时,v为白色被访问先于u 一种可能是返回到v时u仍WHITE,也可能返回时已经是GRAY,可否能是BLACK?如果是BLACK则v.f>u.f则u是v的后代,边为后向边。如果是WHITE则为树边。如果是GRAY,那么v一定是GRAY,仍是后向边。也可以从边的角度分析。
在DFS过程中边(v,u),第一次访问某u如果为WHITE 则树边,GRAY后向边,BLACK则为前向(v.d<u.d)或横向(v.d>u.d)。