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代码。哪一个是正确的?
答案 0 :(得分:2)
两种算法都有效,但第二种版本可能会将同一节点添加到列表L两次。这不会影响正确性,因为额外检查是否访问了节点,但它增加了内存消耗并需要额外检查。这就是为什么你通常会在教科书中看到第一个算法。
答案 1 :(得分:0)
两者都是正确的,但他们使用单词visited
的不同定义。算法通常有很多变化,并且有许多不同的实现都是正确的,而BFS就是一个例子。