Institut für Informatik Lehrstuhl für Informatik 15 Computer Graphik & Visualisierung Diskrete Strukturen I Wintersemester 2006/2007 Übungsblatt 10 Seite 1 von 3 Prof. R. Westermann, J. Schneider, J. Georgii, S. Pott TU München, 08.01.2007 Lösungen zu Diskrete Strukturen I (Blatt 10) Aufgabe 43 [5 Punkte] Komplementärgraph • n = 1. Sei G = ({1}, ). Dann ist G = ({1}, ). Beide Graphen sind 1-f ärbbar und somit auch 2-färbbar. • n = 2. Sei G = ({1, 2}, ). Dann ist G = ({1, 2}, {{1, 2}}). Beide Graphen sind 2-f ärbbar. • n = 3. Sei G = ({1, 2, 3}, {{1, 2}}). Dann ist G = ({1, 2, 3}, {{1, 3}, {2, 3}}). Beide sind 2färbbar. Hier ist es bereits notwendig, daß G eine oder zwei Kanten enthält. • n = 4. Sei G = ({1, 2, 3, 4}, {{1, 2}, {2, 3}, {3, 4}}). Dann ist G = ({1, 2, 3, 4}, {{1, 3}, {1, 4}}, {3, 2}). Beide sind 2-färbbar. Hier ist es notwendig, daß G zwei Kanten enthält. Eine notwendige Voraussetzung für die 2-Färbbarkeit ist, dass G keinen K3 als Teilgraphen enthält. Somit kann es keinen G = (V, N ) mit |V | = 5 geben, für den sowohl G als auch G 2-färbbar wären. Nach Schubfachprinzip hat jeder 2-färbbare Graph G mit mindestens 5 Knoten mindestens 3 Knoten der gleichen Farbe. Diese drei Knoten sind dann im Komplementärgraph durch ein Dreieck verbunden. Wäre das nicht so, dann würde eine Kante zwischen zwei gleichgefärbten Vertices in G existieren. Demnach ist also G nicht mehr 2-färbbar. Aufgabe 44 [2+2+2+2 Punkte] Breitensuche 1 4 T2 T1 3 3 2 5 6 4 1 5 6 2 7 7 Aufgabe 44a,b a) d1 [1] = 0, d1 [2] = 2, d1 [3] = 1, d1 [4] = 2, d1 [5] = ∞, d1 [6] = ∞, d1 [7] = ∞ pred1 [1] = N IL, pred1 [2] = 3, pred1 [3] = 1, pred1 [4] = 3, pred1 [5..7] = N IL. Seite 2 von 3 b) d4 [1] = 2, d4 [2] = 2, d4 [3] = 1, d4 [4] = 0, d4 [5] = 1, d4 [6] = 1, d4 [7] = 2 pred4 [1] = 3, pred4 [2] = 3, pred4 [3] = 4, pred4 [4] = N IL, pred4 [5] = 4, pred4 [6] = 4, pred4 [7] = 6. c) Beweis (indirekt): Annahme: ∃s, v ∈ V : d s [v] 6= dv [s]. Dann existiert ein Pfad mit Kosten d s [v] von s nach v und ein Pfad mit Kosten d v [s] von v nach s. Sei nun oBdA ds [v] < dv [s]. Da die Breitensuche garantiert den kürzesten Pfad findet, stellt dies also einen Widerspruch zur Annahme dar, denn der Pfad mit Kosten dv [s] kann durch den mit den Kosten d s [v] ersetzt werden. d) Folgt aus der Tatsache daß d w [v] die Kosten für den kürzesten Pfad von w nach v bezeichnet. Angenommen dieser Pfad enthält s, dann ist genau dw [v] = dw [s] + ds [v]. Angenommen der Pfad enthält s nicht, und es gilt nicht d w [v] ≤ dw [s] + ds [v]. Dann könnte aber ein kürzerer Pfad von w nach v über s gefunden werden, also Widerspruch zur Annahme. Aufgabe 45 a) [2+1+1+2 Punkte] Traversierung von Binärbäumen • preorder( B1 ) = *+893 • inorder( B1 ) = 8+9*3 • postorder( B1 ) = 89+3* • preorder( B2 ) = ABDFGEHC • inorder( B2 ) = FDGBEHAC • postorder( B2 ) = FGDHEBCA b) preorder, inorder und postorder entsprechen der Tiefensuche, keiner der Algorithmen entspricht der Breitensuche. c) Für alle drei Algorithmen gilt: Jeder Knoten wird genau einmal besucht, zus ätzlich werden die Stoppsymbole ⊥ einmal getestet. Da der Baum binär ist, kann er maximal 2n Stoppsymbole haben, also ist die Laufzeit in O(n) – mit zusätzlichem Speicherverbrauch (für den Stack) von O(log2 n) für einen balancierten Baum und O(n) im schlechtesten Fall. d) Bei allen drei Algorithmen kann man durch Ausgabe der Klammern den Baum rekonstruieren, also z.B. preorder: (Label, linkes Kind, rechtes Kind), postorder (linkes Kind, rechtes Kind, Label) etc. Man kann den Baum bei preorder und postorder Algorithmus auch eindeutig rekonstruieren, wenn man die Stoppsymbole mitausgibt. Alternativ kann man, wie bei der polnischen Notation, den Baum für preorder und postorder rekonstruieren, wenn man die Operatorwertigkeiten (also die Anzahl Kindknoten 6= ⊥) kennt. Im Falle von B2 kann man allerdings dann nicht mehr bestimmen, ob v 7 linkes oder rechtes Kind von v 4 ist. Seite 3 von 3 Aufgabe 46 [2+2+2+2 Punkte] Kürzeste Wege Dortmund 165 83 Köln Kassel 189 Mannheim 68 Karlsruhe 82 88 Frankfurt 228 294 465 Nürnberg 167 Stuttgart 92 Ulm 139 München Aufgabe 46a Aufgabenteil b und c) Der Dijkstra-Algorithmus liefert zunächst nur die Entfernung. Um den Pfad zu bekommen, muss für jeden Knoten ein Zeiger auf einen Vorgängerknoten gehalten werden, genau wie in der Breitensuche. Dieser Zeiger erhält dann ein Update, wenn auch d[v] geändert wird. Dann kann man den durch diese Zeiger gegebenen Pfad rückwärts traversieren, um die Orte “einzusammeln”. Wir geben also zusätzlich zu den Distanzen d den Zeiger p an. 1) F = {Ulm,Stuttgart,Karlsruhe,Mannheim,Frankfurt,Nürnberg,Kassel,Dortmund,Köln}. d[Ulm] = 139, d[Stuttgart] = ∞, d[Karlsruhe] = ∞, d[Mannheim] = ∞, d[Frankfurt] = ∞, d[Nürnberg] = 167, d[Kassel] = ∞, d[Dortmund] = ∞, d[Köln] = ∞, d[München] = 0. p[Ulm] = München, p[Nürnberg] = München. 2) u = Ulm, F = {Stuttgart,Karlsruhe,Mannheim,Frankfurt,Nürnberg,Kassel,Dortmund,Köln}. Updates: d[Kassel] = 604, d[Stuttgart] = 231, d[Frankfurt] = 433. p[Kassel] = Ulm, d[Stuttgart] = Ulm, d[Frankfurt] = Ulm. 3) u = Nürnberg, F = {Stuttgart,Karlsruhe,Mannheim,Frankfurt,Kassel,Dortmund,K öln}. Updates: d[Frankfurt] = 395, p[Frankfurt] = Nürnberg. 4) u = Stuttgart, F = {Karlsruhe,Mannheim,Frankfurt,Kassel,Dortmund,K öln}. Updates: d[Karlsruhe] = 313, p[Karlsruhe] = Stuttgart. 5) u = Karlsruhe, F = {Mannheim,Frankfurt,Kassel,Dortmund,Köln}. Updates: d[Mannheim] = 381, p[Mannheim] = Stuttgart. 6) u = Mannheim, F = {Frankfurt,Kassel,Dortmund,Köln}. Updates: keine neuen kürzeren Wege. 7) u = Frankfurt, F = {Kassel,Dortmund,Köln}. Updates: d[Köln] = 584, p[Köln] = Frankfurt. 8) u = Köln, F = {Kassel,Dortmund}. Updates: d[Dortmund] = 667, p[Dortmund] = Köln. 9) u = Kassel, F = {Dortmund}. Updates: keine kürzeren Wege. 10) u = Dortmund, F = . Updates: keine kürzeren Wege. Rücktraversierung von p[Köln] liefert (Köln, Frankfurt, Nürnberg, München) mit 584km.