Семків Назар 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). ● Найкоротший парний шлях в графі (тобто шлях парної довжини). Дякую за увагу!