Při prohledávání do šířky začneme procházet graf z libovolně zvoleného vrcholu s. Provádí systematicky expanzi listů, po patrech (sousedech).
Zaručuje nám, že výsledná cesta z s do jiného vrcholu bude mít nejmenší možný počet hran. Je vhodný pro řešení uloh typu: nalezení nejkratší cesty z vybraného vrcholu, hledání souvislé komponenty1 či koster souvislých grafů.
Princip
Každý vrchol se může nacházet v jednom z následujících stavů: {FRESH, OPEN, CLOSE}
. Potřebujeme odlišit navštívené a nenavštívené vrcholy. Na počátku označíme všechny stavy jako FRESH
(nenavštívený).
Algoritmus využívá datovou strukturu fronty do které přidává vrcholy a provádí nad ní iterace.
Začneme procházet graf z s, tento vrchol nejprve vložíme do prázdné fronty Q. Následně vrchol navštívíme, vrchol odebereme z fronty Q a jeho nenavštívené sousední vrcholy vložíme do fronty. Abychom věděli, který vrchol navštívit dál, vezmeme vrchol ze začátku fronty Q a zopakujeme předchozí kroky, dokud fronta není prázdná.
Pseudokód
Algoritmus BFS(G, s):
pro každý vrchol v ∈ V(G):
stav(v) := nenavštívený
D(v) := P(v) := undef
stav(s) := navštívený
D(s) := 0
Q := fronta obsahující s
Dokud je fronta Q neprázdná:
Odeber začátek fronty Q, označ ho v
Pro všechny sousedy w vrcholu v:
Pokud stav(w) = nenavštívený:
stav(w) := otevřený
D(w) := D(v) + 1
P(w) := v
přidej w do fronty Q
stav(v) := uzavřený
Časová složitost
Při reprezentaci grafu seznamem sousedů má časovou složitost O(|V|+|E|).
Důkaz
- Každý vrchol je přidán do fronty Q nejvýše jednou, neboť je předtím otevřen a nemůže už tedy vícekrát splnit podmínku na řádku(10).
- V každé iteraci cyklu (7)–(15) je jeden vrchol odebrán z fronty, tento cyklus má tedy nejvýše |V| iterací.
- Celkový počet iterací cyklu (9)–(14) je nejvýše dvakrát tolik, kolik je v grafu hran (jednou „pohled“ hranou z jedné strany, podruhé z opačné).
- Celková časová složitost je tedy O(|V|+|E|)
Paměťová složitost
Algoritmus BFS má při reprezentaci grafu seznamem sousedů paměťovou složitost O(|V|+|E|).
Důkaz
- Reprezentace seznamem sousedů zabírá O(|V|+|E|) paměti.
- Pomocná pole zabírají nejvýše O(|V|)paměti.
- Ve frontě je každý prvek nejvýše jednou, má tedy délku nejvýše|V|, čili zabere maximálně O(|V|)paměti.
- Celkem tedy O(|V|+|E|).
-
komponenta souvislosti ↩