在DFS遍历过程中,需要调用四个数组
Color[u]: 用以区分结点是否被访问
WHITE: 未被发现的结点;
GRAY: 已经发现,但是尚未完成计算的结点;
BLACK: 已经完成计算的结点。
pred[u]: 前序结点指针,指向结点u的前序结点
d[u]: 从源结点到u的距离——结点变为GRAY的时间
f[u]: 结束时间,关于结点u的所有操作结束时的时间——结点变为 BLACK的时间
伪代码解析
DFS(G)
Input: A graph G
Output: None
for 𝑢 𝑖𝑛 𝑉 do
𝑐𝑜𝑙𝑜𝑟[𝑢] ←WHITE; //undiscovered
𝑝𝑟𝑒𝑑[𝑢] ←NULL; //no predecessor
end
𝑡𝑖𝑚𝑒 ← 0;
for 𝑢 𝑖𝑛 𝑉 do
//start a new tree
if 𝑐𝑜𝑙𝑜𝑟 𝑢 𝑖𝑠 𝑒𝑞𝑢𝑎𝑙 𝑡𝑜 𝑊𝐻𝐼𝑇𝐸 then
DFSVisit(𝑢);
end
end
DFSVisit(u) 递归逐层进行访问
DFSVisit(u) #递归函数
Input: A vertex u
Output: None
𝑐𝑜𝑙𝑜𝑟[𝑢] ←GRAY; //u is discovered
𝑑 [𝑢 ]← ++𝑡𝑖𝑚𝑒; //u’s discovery time
for 𝑣 ∈ 𝐴𝑑𝑗(𝑢) do
//Visit undiscovered vertex
if 𝑐𝑜𝑙𝑜𝑟 [𝑣] 𝑖𝑠 𝑒𝑞𝑢𝑎𝑙 𝑡𝑜 𝑊𝐻𝐼𝑇𝐸 then
𝑝𝑟𝑒𝑑 [𝑣] ← 𝑢;
DFSVisit(𝑣);
end
end
𝑐𝑜𝑙𝑜𝑟[𝑢] ←BLACK; //u has finished
𝑓 [𝑢] ← ++𝑡𝑖𝑚𝑒; //u’s finish time