Przeszukiwanie w głąb
DFS grafu nieskierowanego – procedura pozwalająca na eksplorację wszystkich wierzchołków grafu. DFS pozwala odpowiedzieć na pytanie do których wierzchołków grafu można dojść startując z zadanego wierzchołka.
explore
Reprezentujemy graf przy pomocy listy sąsiedztwa. Reprezentacja ta pozwala tylko na znajdowanie sąsiadów wierzchołków grafów. Przyjrzyjmy się procedurze explore
, która pozwala znaleźć wszystkie wierzchołki grafu dostępne z wierzchołka .
explore
:
previsit
for each
:
if not
:
explore
postvisit
Procedur previsit
oraz postvisit
są opcjonalne i pozwalają na wykonanie operacji w momencie odpowiednio pierwszego odwiedzenia wierzchołka i opuszczenia wierzchołka.
visited
jest flagą, która zostanie ustawiona na true
dla wszystkich wierzchołków do których można dojść z wierzchołka startowego.
Szkic dowodu poprawności procedury explore
można wykonać nie wprost:
visited
nie została ustawiona na true
explore
ustawiła flagę visited
na true
explore
była w wierzchołku to powinna przejść do wierzchołka .Przykład explore
:
DFS
for all
:
visited
for all
:
if not
visited
:
explore
Złożoność obliczeniowa:
previsit
oraz postvisit
mamy Pierwszy krok (pętla) sumarycznie dla całego grafu będzie miał złożoność . Drugi krok w każdym wierzchołku ma złożoność obliczeniową zależną od stopnia tego wierzchołka.
Jeśli spojrzymy na to z perspektywy całego grafu to widzimy, że drugi krok przechodzi po każdej krawędzi w grafie dwa razy (dla raz dla explore
, drugi raz dla explore
).
Zatem złożoność drugiego kroku w całym grafie to . W sumie złożoność obliczeniowa DFS wynosi , czyli liniowo w stosunku do wielkości grafu.
Dodajemy do każdego wierzchołka parametr component_number
, zainicjować zmienną cc = 0
na początku procedury DFS, zdefiniować procedurę
previsit
:
component_number = cc
oraz zwiększać zmienną cc
o za każdym razem gdy w procedurze DFS jest procedura explore
. Po wykonaniu tak zmodyfikowanego DFSa w zmiennych component_number
każdego wierzchołka mamy zapisane, do której komponent należy dany wierzchołek, a zmienna cc
zawiera liczbę komponent.