Что делает: обходит граф
Где применяется: нахождение кратчайшего расстояния из одной вершины в невзвешенном графе, алгоритм Прима, алгоритм Дейкстры.
Чего | Точная оценка | Почему |
---|---|---|
Время | O( | V |
Память | O( | V |
Общая идея:
Обойти все ребра графа для “открытия” всех вершин, достижимых из s, вычисляя при этом расстояние (минимальное количество ребер) до каждой вершины.
Реализация:
// псевдокод писала Я так что чекните если что не так!
Queue = ø
int main() {
for v из G(V) do {
v.color = white // расскрашиваем все вершинки в белый
v.distance = ∞ // устанавливаем расстояние до вершин равным бесконечности
}
s.color = gray // инициализируем стартовую вершину
s.distance = 0
Queue.push(s) // добавляем в очередь стартовую вершину
BFS()
}
void BFS() {
while (Queue != ø)
u = Queue.front() // вытаскиваем вершину из очереди
for v из смежных u do
if v.color == white {
v.color = gray
v.distance = u.distance + 1 // поиск кратч. расстояния
Queue.push(v) // добавляем смежные вершинки в очередь
}
u.color = black
}
Реализуется на **очереди!** В очередь сначала добавляется стартовая вершина, затем добавляются в очередь её смежные вершинки, завершается обход стартовой (pop при `Queue.front()`), и BFSим следующую вершинку из очереди.
Таким образом, происходит обход в ширину, т.е. мы не доходим до вершин уровня k+1, пока не пройдем все вершины на уровне k.
‼ Особенности BFS:
Визуализация: