--- title: Tiefensuche date: 2018-11-14 --- Andere Art einen Spannbaum zu finden. **Idee**: Starte bei einem Startknoten und laufe im Graphen soweit wie möglich (ohne Knotenwiederholung). Zwei Änderungen gegenüber Breitensuche: i) Stack statt Queue i) Wir bearbeiten zuerst nur einen Nachbarn # Algorithmus (Tiefensuche) **Eingabe**: $G=(V,E)$ und $s \in V$ i) $pred[v] = NIL, \forall v \in V$ i) $S \leftarrow new Stack()$ i) $S.push(s)$ i) `while (!`$S.isEmpty()$`)` a) $v \leftarrow S.pop()$ a) falls $\exists u \in \Gamma(v) \setminus \{s\}, pred[u] == NIL$ * $pred[u] = v$ * $S.push(v)$ * $S.push(u)$ **Ausgabe**: $pred[v], \forall v \in V$ **Beispiel**: Tiefensuche (Startknoten $A$) ![Graph](20181114_3-dfs.png) | $v$ | A | B | C | D | E | F | | --- | --- | --- | --- | --- | --- | --- | | $pred[v]$ | $\emptyset$ | C | A | B | D | E | | Stack | | --- | | ~~F~~ | | ~~E~~ | | ~~E~~ | | ~~D~~ | | ~~D~~ | | ~~B~~ | | ~~B~~ | | ~~C~~ | | ~~C~~ | | ~~A~~ | | ~~A~~ | | S | # Satz (Spannbaum Erzeugung) Bei Eingabe eines zusammenhängenden Graphen $G=(V,E)$ liefert Algorithmus Tiefensuche einen Spannbaum $T=(V,E)$ mit $E' = \{ \{u,pred[u]\} | u \in V \setminus \{s\} \}$ von $G$ in Laufzeit $O(|V| + |E|)$ # Beweis Analog zur Breitensuche