BFS和“VISITED”一词的正确性

时间:2016-11-12 23:35:56

标签: algorithm breadth-first-search

mark x as visited
list L = x
tree T = x
while L nonempty
    choose some vertex v from front of list
    process v
    for each unmarked neighbor w
        mark w as visited
        add it to end of list
        add edge vw to T

大多数代码会在访问之前选择将相邻节点标记为已访问。首先添加所有邻居并在以后访问它们在技术上是否正确?

list L = x
tree T = x
while L nonempty
    choose some vertex v from front of list
    if (V NOT YET VISITD)
        MARK V AS VISITED HERE
        for each unmarked neighbor w
            add it to end of list
            add edge vw to T

为什么每个BFS似乎都会将节点标记为已访问但您甚至没有访问它们?我试图找到一个理论上正确的BFS代码。哪一个是正确的?

2 个答案:

答案 0 :(得分:2)

两种算法都有效,但第二种版本可能会将同一节点添加到列表L两次。这不会影响正确性,因为额外检查是否访问了节点,但它增加了内存消耗并需要额外检查。这就是为什么你通常会在教科书中看到第一个算法。

答案 1 :(得分:0)

两者都是正确的,但他们使用单词visited的不同定义。算法通常有很多变化,并且有许多不同的实现都是正确的,而BFS就是一个例子。