You are on page 1of 9

Пошук в ширину

Семків Назар
1 курс магістратури, ФВЕ
Постановка задачі
Пошук в ширину (обхід в ширину, BFS) - це один з основних
алгоритмів на графах.

В результаті пошуку в ширину знаходиться шлях найкоротшої


довжини у незваженому графі, тобто шлях, що містить найменшу
кількість ребер.

Алгоритм працює за O(n+m), де n - кількість вершин, m -


кількість ребер.
Алгоритм
На вхід алгоритму подається незважений граф
і номер стартової вершини s. Граф може бути
як орієнтованим, так і неорієнтованим, для
алгоритму це не важливо.
Сам алгоритм можна сприймати як процес
"підпалювання" графа: на нульовому кроці
підпалюємо тільки вершину s. На кожному
наступному кроці вогонь з кожної вершини, що
вже горить, поширюється на всіх її сусідів;
тобто за одну ітерацію алгоритму
відбувається розширення "кільця вогню" в
ширину на одиницю (звідси і назва
алгоритму).
Формальний опис алгоритму
Створимо чергу q, в яку будуть додаватися вершини, що горять, а
також заведемо булевий масив visited[], в якому для кожної
вершини будемо відзначати, горить вона вже чи ні (або іншими
словами, чи була вона переглянутою).
Спершу в чергу додається тільки вершина s, і visited[s] = true, а
для всіх інших вершин visited[] = false.
Потім алгоритм представляє собою цикл: поки черга не порожня,
дістати з її голови одну вершину, переглянути всі ребра, що
виходять з цієї вершини, і якщо якісь з переглянутих вершин (на
протилежних кінцях ребер) ще не горять, то підпалити їх і додати
в кінець черги.
Формальний опис алгоритму
В результаті, коли черга стане пустою, обхід в ширину обійде
всі досяжні з s вершини, причому до кожної дійде найкоротшим
шляхом.

Також можна порахувати довжини найкоротших шляхів (для чого


треба завести масив довжин шляхів d[]), і компактно зберегти
інформацію, якої достатню для відновлення всіх цих
найкоротших шляхів (для цього треба завести масив "предків"
p[], в якому для кожної вершини зберігати номер вершини, з
якої ми потрапили в цю вершину).
Реалізація
Застосування
● Пошук найкоротшого шляху у
незваженому графі.
● Пошук компонент зв'язності у графі
за O(n+m).
● Задачі з найменшим числом ходів,
якщо кожний стан системи можна
уявити вершиною графа, а переходи -
ребрами графа.
● Найкоротший шлях в 0-1-графі
(зважений граф, але з вагами
рівними тільки 0 або 1).
Застосування
● Найкоротший цикл в орієнтованому
незваженому графі.
● Ребра, що лежать на будь-якому
найкоротшому шляху між заданою парою
вершин (a,b).
● Вершини, що лежать на будь-якому
найкоротшому шляху між заданою парою
вершин (a,b).
● Найкоротший парний шлях в графі
(тобто шлях парної довжини).
Дякую за увагу!

You might also like