Answers:
在执行DFS时,任何节点都处于以下三种状态之一:被访问之前,递归访问其子孙期间以及所有子孙都已被访问之后(返回其父节点,即结束阶段)。三种颜色分别对应三种状态。提及回访的颜色和时间的原因之一是明确做出这些区分,以便更好地理解。
当然,这些颜色有实际用途。考虑有向图。假设您要检查G是否存在循环。在无向图中,如果所考虑的节点具有黑色或灰色邻居,则表示周期(并且DFS不会像您提到的那样访问它)。但是,在有向图的情况下,黑色邻居并不意味着循环。例如,考虑具有3个顶点的曲线图- 甲,乙,和Ç,以向边作为甲→ 乙,乙→ Ç,甲→ Ç。假设DFS从A开始,然后访问,然后Ç。当返回A时,它会检查C是否已被访问并且是黑色的。但是图中没有周期。
在有向图中,当且仅当在访问所有节点的所有子节点之前再次看到该节点时,才会出现一个循环。换句话说,如果节点的邻居为灰色,则存在一个周期(而不是邻居为黑色时)。一个灰色节点意味着我们当前正在探索其后代-如果一个这样的后代在此灰色节点上有一个边缘,则存在一个循环。因此,要在有向图中进行循环检测,您需要使用3种颜色。也可能有其他示例,但您应该明白。
灰色顶点表示您已访问该节点并以某种顺序移至其邻居之一,但该节点可能会有更多的邻近顶点。在回溯浏览未访问的顶点时很有用。
假设顶点A有两个邻居B和C和B有一个邻居d。
从白色的顶点A 变为灰色变为并遍历其邻居。
可以说,通过选择字母顺序可以访问白色的顶点B,并标记为灰色。
然后访问白色的D->灰色D- >没有更多的邻居。因此标记为D-> black。
现在,回溯到Gray的B,不再有nieghbors。因此标记为B-> black。
A以灰色回溯A并访问c标记为c-> Grey,不再有邻居将C标记为黑色
最后,返回到A并将顶点A标记为黑色,因为不再有白色顶点,而全部标记为黑色。
在DFS中,我们将边缘分为前边缘,后边缘,交叉边缘和树边缘。
我们使用3种颜色对边缘进行分类。这些颜色表示顶点的状态,即v。白色:尚未发现顶点v。
灰色:已经发现了v,但是尚未找到可从v到达的所有顶点。因此顶点v仍在堆栈中。
黑色:v已从堆栈中弹出。已发现并完成。
在执行DFS时,如果通过边e遇到灰色顶点,则它是后边缘。如果通过边e遇到黑色顶点,则为交叉边/前边。如果遇到白色顶点,则将递归调用DFS。