正如CLRS一书中所述,在进行BFS时,如果节点以前是白色的,我们会将节点着色为灰色,现在将其插入队列中。但我们从不检查节点是否为灰色。那么我们为什么要将节点着色为灰色?
答案 0 :(得分:0)
我在Cormen身上找到了关于quora的答案: https://www.quora.com/Why-do-we-need-to-color-a-node-Grey-in-breadth-first-search-in-addition-to-other-colors-black-and-white
答案 1 :(得分:0)
第594页底部的脚注说明:“我们区分灰色和黑色顶点,以帮助我们了解广度优先搜索的工作方式。实际上,如习题22.2-3所示,即使我们没有区分灰色和黑色顶点。”
因此,BFS实际上可以只用白色和黑色完成。灰色被用作帮助我们可视化算法运行方式的工具。
答案 2 :(得分:0)
首先,让我们看一下BFS如何遍历图表。
从单个给定的源开始。我们发现它的所有相邻节点,然后对以此方式发现的每个节点重复。
一旦发现每个节点,就结束了,不再有其他节点等待处理(在队列中)。 因此,我们真正要跟踪的是:“是否已经(通过较短的路径)到达了此节点?”
考虑到这一点,我们可以将颜色缩小到代表一个二进制状态(已发现/未发现)的布尔值,并依靠队列来保存尚未完全处理的任何节点。
简而言之,如果它是黑色但仍在队列中,请像灰色一样处理。 (需要先在内部for循环之前先查看,然后在之后循环出队)