Informatik IV SS 2006 Institut für Informatik, Abt. I Christel Baier, Sascha Klüppelholz, Jörn Ossowski, Christiane Beyer, Stefan Dombrowski, Li Le, Andreas Lenerz, Dennis Mitzel, Rebecca Reiffenhäuser, Uwe Schuster, Manuel Wedemeyer, Yang Guang 4. Übungsblatt Hinweise zum Übungsbetrieb finden Sie unter http://web.informatik.uni-bonn.de/I/Lehre/Vorlesungen/InfoIV-06/Informatik IV SS06/ Die Abgabe der theoretischen Übungen erfolgt jeweils mittwochs vor Beginn der Vorlesung (bis 10 Minuten nach 11 Uhr) in Hörsaal D. Diejenigen, die diesen Termin nicht wahrnehmen können, haben die Möglichkeit, ihre Lösungen bis dienstags um 18 Uhr in den Briefkasten “Institut für Informatik Abteilung I, Prof. Baier und Mitarbeiter” im Foyer des 1. Stocks einzuwerfen. Abgabe: Di, 02.5.06 18 Uhr Briefkasten oder Mi., 03.05.06. 11:10 HS D Besprechung: 10.05.2006 - 16.05.2006 Alle Übungen finden in N327 statt, außer der Montagsübung von 17-19 Uhr. Diese findet in Raum A121 statt. Hinweis: Die Montagsübungen vom 1.5. finden wegen des Feiertags am darauffolgenden Mittwoch den 3.5. statt. Anwesenheitspflicht besteht nicht. 1 Aufgabe 4.1 [Kantenanzahl vs. Zush.komponenten, 2 Pkt.](0401) Sei G = (V, E) ein ungerichteter Graph mit |V | = n ≥ 1 und k Zusammenhangskomponenten. Zeigen Sie: |E| ≥ n − k Aufgabe 4.2 [DFS/BFS, 2 Pkt.] (22) a) Geben Sie die Besuchsreihenfolge der Knoten an, wenn in folgendem Graphen mit der angegebenen Adjazenzlistendarstellung eine DFS-Traversierung beginnend in Knoten v2 durchgeführt wird, wobei nur die von v2 erreichbaren Knoten besucht werden. Geben Sie zudem wie in den Beispielen in der Vorlesung auch die Schachtelung der DFS-Aufrufe für die rekursive Formulierung der Tiefensuche an. b) Geben Sie die Besuchsreihenfolge der Knoten an, wenn in folgendem Graphen mit der angegebenen Adjazenzliste eine BFS-Traversierung beginnend in Knoten v1 durchgeführt wird, wobei nur die von v1 erreichbaren Knoten besucht werden. v1 v2 v6 v3 v4 v5 v7 v1 v3 v6 v2 v3 v4 v3 v6 v4 v5 v5 v6 v6 v7 v7 v5 v2 Aufgabe 4.3 [Richtig oder falsch, 6 Pkt.] (30) Welche der folgenden Aussagen sind richtig? Begründen Sie Ihre Antwort. Sei G = (V, E) ein gerichteter Graph, n = |V |, und sei eine (feste) Adjazenzlistendarstellung von G gegeben, wobei die Listenköpfe in einem Array abgelegt sind. a) Es ist möglich, daß (i) der erzeugte DFS-Wald aus einem Baum besteht, während (ii) der erzeugte BFS-Wald jedoch aus zwei oder mehreren Bäumen hervorgeht. b) Es ist möglich, daß der erzeugte DFS-Wald aus n Bäumen der Höhe 0 besteht, wenn es einen Knoten v mit Post∗ (v) = V gibt. 2 c) Falls |Post(v)| ≤ k für alle Knoten v ∈ V , so besteht der DFS-Wald aus Bäumen vom Verzweigungsgrad k. d) Falls |Post(v)| = k für alle Knoten v ∈ V , so hat jeder innere Knoten v des erzeugten BFS-Waldes genau k Söhne. Aufgabe 4.4 [DFS/BFS-Wald, 2 Pkt.] (0402) Geben Sie ein Beispiel für einen Digraphen G = (V, E) und einen Teilgraphen T = (V, E ′ ), wobei E ′ ⊆ E, so dass folgende Aussagen gelten: (1) T ist ein Wald. (2) T kann weder durch ein Tiefen- noch durch eine Breitensuche aus G entstehen. (Unabhängig von der Knotenreihenfolge oder Anordnung der Adjazenzlisten) Begründen Sie Ihre Antwort. Aufgabe 4.5 [Endliche Automaten, 3 Pkt.] (31) Gegeben ist ein nichtdeterministischer endlicher Automat M = (Q, Σ, δ, Q0 , F). Skizzieren Sie Algorithmen mit der Laufzeit O (n + m) für folgende Problemstellungen, wobei n = |Q|, m = |{(q, a, p) ∈ Q × Σ × Q : p ∈ δ(q, a))}| : a) Leerheitsproblem : Ist die von M akzeptierte Sprache L (M ) leer? b) Redundanzproblem : Bestimme die Zustände q ∈ Q, für welche die Sprache L (Mq ) leer ist. Dabei ist Mq = (Q, Σ, δ, {q}, F), d.h. der endliche Automat, welcher aus M hervorgeht, wenn q als einziger Anfangszustand ausgezeichnet wird. Sie können davon ausgehen, daß (1) δ durch Adjazenzlisten dargestellt ist, wobei die Listenköpfe in einem Array verwaltet werden. (2) Die Anfangszustandsmenge Q0 und die Endzustandsmenge F durch Bitvektoren dargestellt sind. WICHTIG : Die Laufzeit O (n +m) darf nicht überschritten werden (unabhängig von der Größe von Q0 und F). 3 Aufgabe 4.6 [Graphtraversierung, 4 + 4 + 2 = 10 Pkt.] (02p) Implementieren Sie ein Programm, welches von der Kommandozeile aus einen ungerichteten Graphen einliest. Verwenden Sie dabei als Format folgende Textkodierung einer Adjazenzliste: Am Anfang steht die Gesamtzahl aller Knoten des Graphen. Dann folgen Zeilen, welche die Nummer des aktuellen Knotens beinhalten, gefolgt von den Nummern der zu diesem Knoten adjazenten Knoten. Jede Zeile wird mit einem „;“ abgeschlossen. Beispiel (Das Haus vom Nikolaus): 5; 1 2 2 1 3 1 4 2 5 2 3; 3 4 5; 2 4 5; 3 5; 3 4; Bemerkung: Dieses Eingabeformat stellt nicht sicher, daß es sich um eine korrekte Adjazenzliste handelt, d.h. ob zu jedem Listenverweis zu einem Nachfolgeknoten bei diesem auch einer auf den Vorgängerknoten vorhanden ist. Ihr Programm muß dies nicht überprüfen, sie dürfen davon ausgehen, daß die Eingabe korrekt ist. Verwenden Sie intern genau die gegebene Adjazenzlistendarstellung und keine Matrixdarstellung. (a) Implementieren Sie eine Tiefensuche (DFS) auf dem eingelesenen Graphen von einem Anfangsknoten v, welche die von v erreichbaren Zustände besucht. Geben Sie die Besuchsreihenfolge auf dem Bildschirm aus. Der Anfangsknoten v wird dabei als zusätzliche Eingabe vorher eingelesen. (b) Implementieren Sie eine Breitensuche (BFS) von einem bestimmten Anfangsknoten v, die den von v erreichbaren Teil des Graphen besucht. Geben Sie auch hier die Besuchsreihenfolge auf dem Bildschirm aus. Verwenden Sie nun diesen Algorithmus zum Finden eines kürzesten Weges von einem bestimmten Knoten zu einem anderen. Start- und Zielknoten werden als zusätzliche Eingabe vorher eingelesen. Ist der zu suchende Knoten nicht erreichbar, so soll das Programm „infinity“ ausgeben. (c) Erweitern Sie Ihr Programm, indem Sie mithilfe der Breiten- oder der Tiefensuche einen Algorithmus implementieren, der alle Zusammenhangskomponenten des eingegebenen Graphen findet und korrekt in demselben Format ausgibt, welcher zum Einlesen verwendet wird (s.o.). Bemerkung zur Implementation und zur Abgabe: Es gelten im wesentlichen dieselben Regeln, welche schon bei Aufgabe 2.5 Anwendung fanden. Sie dürfen für Ihre Implementation JAVA oder C/C + + verwenden. Die Abgabe der Programmieraufgaben wird in der Woche vom 08.05.2006 bis 12.05.2006 im UNIX CIP-Pool (2. Stock) stattfinden. Die genauen Termine werden in Aushängen an der Tür des CIP-Pools bekannt gegeben. Dort müssen Sie sich auch für die Abgabe eintragen. 4