灰色节点在图深度优先搜索中的目的


19

在我看到的深度优先搜索的许多实现中(例如: here),代码区分灰色顶点(已发现,但并非所有邻居都被访问过)和黑色顶点(已发现且其所有邻居都被访问过) 。这种区别的目的是什么?似乎DFS算法永远不会访问被访问的顶点,无论它是灰色还是黑色。

Answers:


26

在执行DFS时,任何节点都处于以下三种状态之一:被访问之前,递归访问其子孙期间以及所有子孙都已被访问之后(返回其父节点,即结束阶段)。三种颜色分别对应三种状态。提及回访的颜色和时间的原因之一是明确做出这些区分,以便更好地理解。

当然,这些颜色有实际用途。考虑有向图。假设您要检查G是否存在循环。在无向图中,如果所考虑的节点具有黑色或灰色邻居,则表示周期(并且DFS不会像您提到的那样访问它)。但是,在有图的情况下,黑色邻居并不意味着循环。例如,考虑具有3个顶点的曲线图- Ç,以向边作为ÇÇ。假设DFS从A开始GG一种C一种C一种C一种,然后访问,然后Ç。当返回A时,它会检查C是否已被访问并且是黑色的。但是图中没有周期。C一种C

在有向图中,当且仅当在访问所有节点的所有子节点之前再次看到该节点时,才会出现一个循环。换句话说,如果节点的邻居为灰色,则存在一个周期(而不是邻居为黑色时)。一个灰色节点意味着我们当前正在探索其后代-如果一个这样的后代在此灰色节点上有一个边缘,则存在一个循环。因此,要在有向图中进行循环检测,您需要使用3种颜色。也可能有其他示例,但您应该明白。


2
+1很好的解释。为了简单遍历无向图(如在我的问题正文中链接的一个图)中的所有节点,GRAY和BLACK在功能上没有区别吗?
user6805 2013年

1
@ user6805对于简单遍历-访问有向图或无向图的每个节点-灰色和黑色之间没有功能上的区别。您只能使用两种颜色(或已访问/未访问)。对于更复杂的算法,您需要颜色。
Paresh

我明白了!好,请考虑以下情况:twitter.com/MaksimADmitriev/status/796995958043279361我们使用DFS遍历图。左侧的图表与此答案中的图表相同,并且没有循环。让我们遍历具有循环的右侧图。我们访问A并将其标记为灰色。我们访问B并将其标记为灰色。我们访问C并将其标记为灰色。现在,我们将访问已经是灰色的A。因此,“从黑色到黑色”并不意味着存在一个循环,而是“从灰色到灰色”确实存在。这就是为什么我们需要灰色。如果我错了,请指正我
Maksim Dmitriev

对于更复杂的目的,例如查找牢固连接的组件,可能需要为每个节点记录两次:第一次发现节点之前的时间(即,其为灰色的时间)和一次节点完成访问后的时间(即,颜色为黑色的时间)。为了实现记录,需要维护一个计数器,该计数器会随着每个事件的发生而增加。
约翰,

2

这是CLRS中的一项练习,您可以删除灰色或黑色,并且该算法仅适用于两种颜色,也就是说,实际上并不需要。标记顶点的主要目的是通过重复访问已经访问过的顶点来确保我们不会陷入无限循环。

在DFS算法中使用3种颜色的原因主要是教学上的:它在概念上更加清晰,它可以帮助学生了解每个节点在执行过程中发生了什么。


0

灰色顶点表示您已访问该节点并以某种顺序移至其邻居之一,但该节点可能会有更多的邻近顶点。在回溯浏览未访问的顶点时很有用。

假设顶点A有两个邻居B和C和B有一个邻居d

从白色的顶点A 变为灰色变为并遍历其邻居。

可以说,通过选择字母顺序可以访问白色的顶点B,并标记为灰色。

然后访问白色的D->灰色D- >没有更多的邻居。因此标记为D-> black

现在,回溯到Gray的B,不再有nieghbors。因此标记为B-> black

A以灰色回溯A并访问c标记为c-> Grey,不再有邻居将C标记为黑色

最后,返回到A并将顶点A标记为黑色,因为不再有白色顶点,而全部标记为黑色。


我看不出灰色和黑色之间的区别在这里是否有任何用途
。–

那就是你必须了解的。如果顶点标记为黑色,则表示该顶点将没有任何相邻的顶点。这里的顶点D被标记为黑色,因为没有相邻的顶点..灰色表示存在更多要访问的邻居,因此您遍历了这些顶点。
NRK

我相信它可以使您免于仅仅重新访问某些肯定没有后缘的节点(即优化)
Setheron 2014年

0

在DFS中,我们将边缘分为前边缘,后边缘,交叉边缘和树边缘。

我们使用3种颜色对边缘进行分类。这些颜色表示顶点的状态,即v。白色:尚未发现顶点v。

灰色:已经发现了v,但是尚未找到可从v到达的所有顶点。因此顶点v仍在堆栈中。

黑色:v已从堆栈中弹出。已发现并完成。

在执行DFS时,如果通过边e遇到灰色顶点,则它是后边缘。如果通过边e遇到黑色顶点,则为交叉边/前边。如果遇到白色顶点,则将递归调用DFS。


好,那有什么意义呢?您已经说过白色/灰色/黑色与前进/后退/交叉/树相关,但是您也没有说这些是什么意思。所以,问问者现在有七件事,而不仅仅是三件事!
David Richerby

这些边缘可用于DFS的各种应用中,例如后边缘用于识别图形中的循环,正向和交叉边缘用于测试每对顶点之间是否存在唯一路径。
Neeraj Singh '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.