BFS
Mamy graf gdzie jest funkcją mierzącą długość krawędzi.
Odległością między wierzchołkami nazywamy długość najkrótszej ścieżki pomiędzy i . Na początek założymy, że wszystkie krawędzie będą miały długość czyli i będziemy pomijać funkcję dla uproszczenia.
BFS jest procedurą pozwalającą dla grafu wyznaczyć drzewo najkrótszych ścieżek od wierzchołka startowego . Intuicja stojąca za BFS jest taka, że będziemy przeszukiwać graf warstwa po warstwie, gdzie warstwa będzie rozumiana jako podzbiór wierzchołków w tej samej odległości od wierzchołka startowego .
BFS
:
for all
:
dist
null
dist
while
:
eject
for all
:
if dist
:
.inject
dist
dist
Powyższa procedura na początku inicjuje odległości wszystkich wierzchołków na poza odległością do wierzchołka startowego , która ustalana jest na . Dodatkowo, ustala rodziców węzłów w wynikowym drzewie BFS na null
poza węzłem startowym, którego rodzica możemy ustalić na niego samego. Następnie inicjujemy kolejkę FIFO (first in frist out) , która na początku zawiera tylko wierzchołek startowy . Następnie ściągamy pierwszy wierzchołek z kolejki i sprawdzamy czy odwiedziliśmy już wcześniej jego sąsiadów. Jeśli tak to nic nie robimy, bo oznacza to, że znaleźliśmy do nich krótszą ścieżkę, w przeciwnym przypadku wrzucamy nowo odkryte wierzchołki na koniec kolejki i ustawiamy odległość do nich na odległość do wierzchołka, z którego do nich doszliśmy oraz ustalamy z jakiego wierzchołka doszliśmy najkrótszą ścieżką do nich. Ustalenie pozwala odtworzyć najkrótszą ścieżkę od zadanego wierzchołka do wierzchołka startowego (czyli w praktyce zbudować wynikowe drzewo BFS).
Zauważmy, że procedura ta spełnia następujące warunki:
istnieje moment w którym:
Używając powyższych własności jako założenia indukcyjnego dla ustalonego możemy łatwo zauważyć, że po ewaluacji wierzchołków będących w kolejce (w ostatnim punkcie) przez algorytm, wszystkie te trzy własności zostaną spełnione dla odległości . Daje nam to dowód indukcyjny poprawności wyznaczania drzewa najkrótszych ścieżek przez procedurę BFS dla grafu wejściowego i wierzchołka startowego .
Zauważmy, że jeśli jakiś podzbiór wierzchołków grafu nie jest dostępny z wierzchołka startowego to po zakończeniu BFSa wierzchołki te nie zostaną odwiedzone, a odległość do nich pozostanie równa .
while
) co daje operacji na kolejce for
(będącej w pętli while
), w której sprawdzana jest każda krawędź (dla grafu skierowanego raz, dla grafu nieskierowanego dwa razy) co generuje złożoność