G = (V, E) G G

Werbung
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
Herunterladen