Technische Universität München Zentrum Mathematik Diskrete Optimierung: Grundlagen (MA 2501) Prof. Dr. R. Hemmecke, Dr. R. Brandenberg, M.Sc.-Math. B. Wilhelm Übungsblatt 2 Aufgabe 2.1 Sei G = (V, E) ein Graph. a) Zeigen Sie: der in der Vorlesung vorgestellte DFS Algorithmus besitzt Laufzeit O(|V | + |E|) = O(max(|V |, |E|)). b) Formulieren Sie analog zum DFS Algorithmus der Vorlesung den sogenannten BreadthFirst-Search (BFS) Algorithmus. Dieser erfüllt die gleichen Ziele wie der DFS Algorithmus, jedoch werden im BFS Baum nach Möglichkeit zunächst alle Kanten zu den Knoten der Nachbarschaft eines gerade markierten Knotens gesammelt. c) Sei G zusammenhängend, aber nicht kreisfrei. Zeigen Sie: Die durch den BFS bzw. DFS Algorithmus konstruierten Spannbäume TBreit und TT ief von G sind verschieden, wenn beide Algorithmen mit dem selben Knoten starten. Lösung zu Aufgabe 2.1 a) Zuerst zeige man O(|V | + |E|) = O(max(|V |, |E|)) und überlege sich, dass O(|V |) ) O(|E|) nur dann, wenn man Graphen betrachtet, die viel mehr isolierte Knoten als Kanten besitzen. Dann stelle man fest, dass die äußere Schleife des Algorithmus (2.) genau soviele Durchläufe benötigt wie der Graph Zusammenhangskomponenten (Vi , Ei ) besitzt. Der rekursive Aufruf SEARCH(w) innerhalb von SEARCH(v) für die Wurzel v einer Zusammenhangskomponente geschieht nur dann, wenn w noch unmarkiert ist, also genau einmal für jeden Knoten außer v. In toto werden in SEARCH(v) und den rekursiven Aufrufen alle Knoten und Kanten Ei der jeweiligen Zusammenhangskomponente maximal zweimal l angepackt “(d.h. O(1) Arbeitsschritte pro Knoten und Kante), ” Search(v) wird also in O(|Vi + |Ei |) = O(1 + |Ei |) beendet. P Die Gesamtlaufzeit ist also i O(1 + |Ei |) = O(|V | + |E|). b) Einzige Änderungen: Markiere v vor Search(v), führe eine zunächst leere Liste W ← ∅ ein und in Search(v) ändere 4. zu Ist w unmarkiert, dann markiere w, setze T = ” T ∪ {v, w} und füge es hinten an die Liste W an“. Ergänze hinter der Schleife, aber vor END SEARCH 5. nimm nun den ersten Knoten u aus der Liste W heraus und ” CALL SEARCH(u). c) Sei v der gemeinsame Startknoten, e ∈ E \ EBreit und C der Kreis in EBreit ∪ e. Seien vBreit und vT ief die jeweils ersten Knoten, die mittels BFS/DFS von C erreicht werden. Ist vBreit = vT ief und sind w1 , w2 die beiden Nachbarn von vBreit in C, dann ist {vBreit , wi } ∈ EBreit \ ET ief für mindestens ein i ∈ {1, 2}. Ist vBreit 6= vT ief , so erreicht die Tiefensuche vBreit über einen Pfad v, . . . , vT ief , . . . , vBreit , besitzt also eine Kante, die nicht in EBreit liegen kann, da die Breitensuche ja bereits auf einem Pfad ohne vT ief zu vBreit gelangt, der v, vBreit -Weg aber natürlich in jedem Baum eindeutig sein muss. Aufgabe 2.2 Sei G = (V, E) ein Graph mit |V | = n, |E| = m und v, w ∈ V . Ferner sei dist (v, w) die Anzahl der Kanten eines kantenminimalen v, w-Weges. Welche der folgenden Aussagen sind richtig? (i) Man kann dist (v, w) unter Verwendung von DFS/BFS in O(n + m) bestimmen. (ii) Man kann die Liste der Abstände zwischen allen Knotenpaaren unter Verwendung von DFS/BFS in O(n + m) bestimmen. (iii) Man kann die Liste der Abstände zwischen allen Knotenpaaren unter Verwendung von DFS/BFS in O(nm) bestimmen. (iv) Man kann unter Verwendung von DFS/BFS in O(n + m) bestimmen, ob G bipartit ist. (v) Man kann in O(m) bestimmen, ob G bipartit ist. Lösung zu Aufgabe 2.2 (i) Geht mit BFS. Wähle v als Wurzel und ergänze BFS wie folgt: setze dist (v) ← 0 und bei dann markiere w “dist (w) = dist (v) + 1. Mit DFS geht es nicht, da DFS ” zunächst unnötig lange Wege zu den Knoten bestimmt und diese können später innerhalb des DFS nicht wirklich korrigiert werden. (ii) Geht weder mit DFS noch mit BFS. Ist etwa G ein Baum, so ist jeder Knoten mit jedem anderen verbunden, d.h., die Liste der Abstände hat O(n2 ) Einträge, diese können dann aber nicht in O(n + m) = O(n) geschrieben werden. (iii) Versucht man die volle Liste der Abstände zu schreiben auch wenn viele Knoten isoliert sind, geht es nicht. Im Extremfall ist E = ∅, also O(nm) = O(0), aber die Liste hat die Größe O(n2 ). Schreibt man nur endliche Abstände in die Liste, dann geht das mittels BFS, da der Algorithmus pro Zusammenhangskomponente (Vi , Ei ) ˙ i |) = O(|Vi ||E ˙ i |) (da Ei 6= 0) alle Abstände bestimmt. In toto in O(|Vi |2 + |Vi ||E ergibt sich also O(nm), wenn man die isolierten Knoten nie anfasst (das geht!). (iv) Geht mit beiden Algorithmen, indem man statt der Markierung gleich eine Farbe vergibt und abbricht, wenn eine Kante zwei Knoten gleicher Farbe verbindet. (v) Geht mit beiden Algorithmen (wieder dürfen isolierte Knoten nicht angefasst werden).