Informatik III: Aufgabenblock 6 Version (FWM) vom 6. Oktober 2003 Abgabe vor dem 6. Feb. 2004. Keine Verlängerung! 1 Baum erstellen Schreiben Sie aufbauend auf Aufgabenblock 5 eine Funktion die feststellt, ob ein gegebener gerichteter Graph zusammenhängend ist. Man nennt einen gerichteten Graphen zusammenhängend, wenn im zugrunde liegenden ungerichteten Graphen je zwei Knoten durch einen Weg miteinander verbunden sind. Am einfachsten kann man diese Eigenschaft mit Hilfe einer Tiefensuche überprüfen. Dazu , in dem gespeichert wird, ob ein Knoten im benutzt man einen Vektor der Dimension Verlauf der Tiefensuche bereits betrachtet wurde, und einen Vektor der Dimension , dem man entnehmen kann, welche Kanten benutzt wurden. Der Algorithmus zur Tiefensuche lautet in einer informellen rekursiven Formulierung: baumMarkieren(Startknoten) markiere Startknoten als besucht für jede Kante die zum Startknoten inzident ist wenn der andere Knoten der Kante noch nicht markiert ist markiere Kante baumMarkieren(anderer Knoten) ende ende ende Nach der Terminierung des Algorithmus, kann man dem Vektor der Knotenmarkierungen entnehmen, ob der Graph zusammenhängend ist. Ist der Graph zusammenhängend, bilden die markierten Kanten einen aufspannenden Baum. Ein Baum ist ein kreisfreier, zusammenhängender Graph, also ein Graph, in dem es zwischen je zwei Knoten einen eindeutigen Weg gibt. Man sagt, ein Baum spannt einen Graphen auf, wenn der Baum alle Knoten von enthält. Implementieren Sie diesen Algorithmus und testen Sie ihn. Schreiben Sie eine Funktion, die nach der Tiefensuche feststellt, ob der Graph zusammenhängend ist. 2 Kreise in Graphen Fügt man in einen Baum weitere Kanten ein, entstehen Kreise, also Wege mit gleichem Anfangsund Endknoten. Die Kanten eines Graphen, die nicht in einem gegebenen aufspannenden Baum enthalten sind, nennen wir Verbindungskanten. Jede dieser Verbindungskanten induziert einen eindeutigen Kreis. Um alle Knoten und Kanten dieses Kreises zu finden, genügt es, im aufspannenden Baum den Weg zwischen den beiden Endknoten der Verbindungskante zu finden. 1 Ist der aufspannende Baum durch einen Tiefensuche gefunden worden, kann man diese Wegsuche effizienter gestalten, denn eine Verbindungskante kann es nur zwischen zwei Knoten geben, die auf dem gleichen Ast des Baumes liegen. Mit Ast bezeichnen wir hier einen Weg von der Wurzel des Baumes, also dem Knoten, mit dem Sie die Tiefensuche gestartet haben, zu einem Blatt, also einem Knoten des Baumes ohne Nachfolger. Um diese Eigenschaft ausnutzen zu können, merkt man sich im Verlauf der Tiefensuche zu jedem Knoten seine Tiefe und seinen Vorgängerknoten im Baum. Sucht man nun den Weg zwischen den beiden Endknoten einer Verbindungskante beginnt man bei dem tiefer liegenden Knoten und geht solange aufwärts, bis man bei dem anderen Endknoten angekommen ist. Erweitern Sie die Tiefensuche bei der Baumerstellung, so dass diese zusätzlichen Informationen mit abgespeichert werden. 3 Kreis-Kanten-Inzidenzmatrix Wir wollen nun eine Kreis-Kanten-Inzidenzmatrix zu einem gegebenen Graphen aufstellen. Diese Matrix enthält eine Zeile pro durch Zufügen einer Verbindungskante entstandenen Kreis, und eine Spalte pro Kante. Die Einträge der Matrix sind wenn die Kante die selbe Richtung hat, in der der Kreis durchlaufen wird, , wenn sie entgegengerichtet ist, und wenn diese Kante im Kreis nicht vorkommt. Verwenden Sie die erstellten Datenstrukturen, um alle oben beschriebenen Kreise zu finden. Erzeugen Sie obige Kreis-Kanten-Inzidenzmatrix, indem Sie die Kreise durchlaufen und die entsprechenden Zahlen in die Matrix eintragen. Die Kreis-Kanten-Inzidenzmatrix wollen wir im Folgenden nutzen, um ein lineares Gleichungssytem zu lösen. Zu gegebenem wollen wir ein mit (1) bestimmen. Dazu berechnen wir zunächst einen Vektor mit (2) Anschließend bestimmen wir einen Vektor aus (3) Schließlich erhalten wir das gewünschte Ergebnis durch &% !. Dabei ist wieder eine Diagonalmatrix mit "!$# ! Schreiben Sie eine Funktion, die ein Matrix-Vektor-Produkt berechnet. 2 (4) Schreiben Sie ein Programm, dass das Gleichungssystem (??) unter Zuhilfenahme der Schritte (??)–(??) löst. In dem Beispielnetzwerk ergibt sich bei einer Eingabe von als Teilantwort und . Berechnen Sie mit ihrem Programm die fehlenden Werte. Verifizieren Sie ihr Programm mit einigen selbst erstellten Beispiel-Netzwerken. 3