Przeszukiwanie wszerz

by Jerry Sky



BFS(G,s)(G, s)

Mamy graf G=(V,E,l)G = (V,E,l) gdzie l:ERl: E \to \mathbb{R} jest funkcją mierzącą długość krawędzi.

Odległością między wierzchołkami v,uVv,u \in V nazywamy długość najkrótszej ścieżki pomiędzy vv i uu. Na początek założymy, że wszystkie krawędzie będą miały długość 11 czyli eE l(e)=1\forall_{e \in E}~l(e) = 1 i będziemy pomijać funkcję ll dla uproszczenia.

BFS jest procedurą pozwalającą dla grafu G=(V,E)G = (V,E) wyznaczyć drzewo najkrótszych ścieżek od wierzchołka startowego sVs\in V. 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 ss.

BFS(G,s)(G,s):

  1. for all vVv \in V:
    1. dist(v)(v) \gets \infty
    2. v.prevv.\mathrm{prev} \gets null
  2. dist(s)0(s) \gets 0
  3. s.prevss.\mathrm{prev} \gets s
  4. Q[s]Q \gets [s]
  5. while Q>0|Q| > 0:
    1. uQu \gets Q.eject()()
    2. for all (u,v)E(u,v) \in E:
      1. if dist(v)=(v) = \infty:
        1. QQ.inject(v)(v)
        2. dist(v)(v) \gets dist(u)+1(u) + 1
        3. v.prevuv.\mathrm{prev} \gets u

Powyższa procedura na początku inicjuje odległości wszystkich wierzchołków na \infty poza odległością do wierzchołka startowego ss, która ustalana jest na 00. 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) QQ, która na początku zawiera tylko wierzchołek startowy ss. 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 QQ i ustawiamy odległość do nich na odległość do wierzchołka, z którego do nich doszliśmy +1+1 oraz ustalamy z jakiego wierzchołka doszliśmy najkrótszą ścieżką do nich. Ustalenie v.prevv.\mathrm{prev} pozwala odtworzyć najkrótszą ścieżkę od zadanego wierzchołka do wierzchołka startowego ss (czyli w praktyce zbudować wynikowe drzewo BFS).

Zauważmy, że procedura ta spełnia następujące warunki:
 d=0,1,2,\forall~d = 0,1,2,\dots istnieje moment w którym:

Używając powyższych własności jako założenia indukcyjnego dla ustalonego dd możemy łatwo zauważyć, że po ewaluacji wierzchołków będących w kolejce QQ (w ostatnim punkcie) przez algorytm, wszystkie te trzy własności zostaną spełnione dla odległości d+1d+1. Daje nam to dowód indukcyjny poprawności wyznaczania drzewa najkrótszych ścieżek przez procedurę BFS dla grafu wejściowego GG i wierzchołka startowego ss.

Zauważmy, że jeśli jakiś podzbiór wierzchołków grafu GG nie jest dostępny z wierzchołka startowego ss to po zakończeniu BFSa wierzchołki te nie zostaną odwiedzone, a odległość do nich pozostanie równa \infty.

Złożoność obliczeniowa

Przykład

example

More