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
Основная часть кода будет выбирать, как отмечать соседний узел как посетивший его перед посещением. Не будет ли технически корректным добавлять всех соседей и посещать их позже?BFS и правильность термина «ПОСЕТИЛ»
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. Какой из них правильный?
Re: «вторая версия может добавить один и тот же узел в список L дважды»: или более двух раз. В крайнем случае, если граф является полным графом с вершинами * n *, то одна вершина будет добавлена один раз, один дважды, трижды и т. Д., Вплоть до одной добавленной вершины (* n * - 1) раз. Таким образом, алгоритм, который должен быть линейным по числу вершин, вместо этого квадратичен. – ruakh
@ruakh Правильно, но это только космическая сложность, которая страдает. Сложность времени для полного графа всегда квадратична по числу вершин, так как число ребер уже квадратично. – nwellnhof
Хорошая точка. (Размышляя об этом, бит 'для каждого немаркированного соседа w' должен действительно означать' для каждого соседа w 'plus', если w не отмечен знаком.) – ruakh