Graphentheorie Rainer Schrader Zentrum für Angewandte Informatik Köln 14. November 2007 1 / 22 2 / 22 Gliederung eulersche und semi-eulersche Graphen Charakterisierung eulerscher Graphen Berechnung eines Euler-Pfads Zur Erinnerung: D C A B Frage: Ist es möglich, einen Rundgang so zu machen, dass man jede Brücke genau einmal passiert und zum Ausgangspunkt zurückkehrt? 3 / 22 4 / 22
ein zusammenhängender Graph heißt semi-eulersch, wenn ein Pfad v 0, v 1,..., v k existiert, der alle Kanten genau einmal durchläuft offensichtlich ist nicht jeder Graph eulersch, auch nicht jeder semi-eulersche Graph der Graph heißt eulersch, wenn ein semi-eulerscher Pfad existiert mit v 0 = v k das Königsberger-Brücken-Problem besteht dann darin, für den folgenden Graphen zu entscheiden, ob er eulersch (bzw. semi-eulersch) ist: D c 2 3 4 5 1 9 10 8 6 7 12 1 9 11 8 2 10 6 7 5 4 3 C A b d das folgende Lemma liefert die Basis für die Charakterisierung eulerscher Graphen B a 5 / 22 6 / 22 Gliederung eulersche und semi-eulersche Graphen Charakterisierung eulerscher Graphen Berechnung eines Euler-Pfads Lemma 1 Sei G ein Graph mit d (v ) 2 für alle v V. Dann enthält G einen Kreis. (i) G enthält eine Schlinge oder Mehrfachkanten (ii) G ist einfach: konstruiere eine Kantenfolge v 0, v 1,... wie folgt: wähle v 0 V beliebig, wähle v i+1 N(v i ) v i 1 da V <, muss irgendwann ein Knoten zum zweiten Mal erreicht werden. 7 / 22 8 / 22
Satz 2 Ein zusammenhängender Graph ist genau dann eulersch, wenn d (v ) gerade ist für alle v V. sei P ein geschlossener eulerscher Pfad dann wird jeder Knoten genau so oft verlassen wie erreicht und jedesmal auf verschiedenen Kanten daher ist d (v ) gerade sei umgkehrt G ein Graph mit d (v ) gerade für alle v V nach dem vorigen Lemma 1 enthält G einen Kreis C falls C schon alle Kanten von G enthält, ist die Behauptung bewiesen andernfalls betrachte H = G C es ist E (H) < E (G) und d (v ) gerade für alle v V (H) damit folgt per Induktion: jede Komponente von H hat einen geschlossenen eulerschen Pfad, zusammen mit C ergeben diese einen geschlossenen eulerschen Pfad von G. wir führen eine Induktion über E durch da G zusammenhängend ist, folgt d (v ) 2 für alle v V nach dem vorigen Lemma 1 enthält G einen Kreis C 9 / 22 10 / 22 Als Folgerung aus dem letzten Satz ergibt sich: Korollar 3 Ein zusammenhängender Graph ist genau dann eulersch, wenn er Vereinigung von kantendisjunkten Kreisen ist. Korollar 4 Ein zusammenhängender Graph ist semi-eulersch genau dann, wenn die Anzahl der Knoten mit ungeraden Grad 0 oder 2 ist. damit enthält er entweder keine Knoten mit ungeradem Grad oder zwei umgekehrt ist der Graph nach Satz Satz 2 entweder eulersch (und damit semi-eulersch) oder er wird eulersch, wenn wir einen neuen Knoten a hinzufügen, den wir mit den beiden ungeraden Knoten verbinden im letzten Fall sind die ungeraden Knoten in jedem geschlossenen Euler-Pfad direkte Nachbarn von a wenn wir a und die beiden neuen Kanten entfernen, erhalten wir den gesuchten Euler-Pfad. ein semi-eulerscher Graph besitzt entweder einen geschlossenen eulerschen Pfad (d.h. er ist eulersch) oder einen normalen eulerschen Pfad 11 / 22 12 / 22
Mit der gleichen Technik folgt: Korollar 5 Sei G ein zusammenhängender Graph und 2k die Anzahl der ungeraden Knoten. Dann lässt sich E in k kantendisjunkte Wege zerlegen. Gliederung eulersche und semi-eulersche Graphen Charakterisierung eulerscher Graphen Berechnung eines Euler-Pfads seien die ungeraden Knoten x 1,..., x k, y 1,..., y k füge zu G neue Knoten a 1,..., a k 1 i k hinzu mit Kanten (a i, x i ) und (a i, y i ) für der so entstandene Graph ist eulersch wie vorher, kommen in jedem eulerschen Pfad die Kanten (a i, x i ), (a i, y i ) direkt nacheinander vor entfernen wir diese Kanten, so erhalten wir die gewünschte Zerlegung. 13 / 22 14 / 22 der Beweis von Satz 2 liefert einen Algorithmus zur Bestimmung eines eulerschen Pfades die einzige Schwierigkeit, die es zu beachten gibt, ist die folgende: sei G k der Teilgraph der Kanten, die wir nach k Schritten noch nicht durchlaufen haben sei x der aktuelle Knoten x Beispiel: betrachte den folgenden Eulerschen Graphen v w u die Konstruktion beginne in Knoten u und wählt die Kanten (u, v ) und (v, w ) v wir müssen vermeiden, eine Schnittkante zu wählen, da wir sonst nicht mehr in die Zusammenhangskomponente zurückkommen w u es sei denn, d Gk (x) = 1. danach darf nicht die Kante (w, u) gewählt werden 15 / 22 16 / 22
Bestimmung eines Euler-Pfads (Fleury) (1) wähle eine beliebigen Startknoten a (2) folge einem Kantenzug, der keine Kante zweimal benutzt (3) sei x der im Schritt k erreichte Knoten (5) sei G k der von den unbenutzten Kanten induzierte Teilgraph (4) falls x a und d Gk (x) > 1 : (5) verlasse x niemals auf einer Schnittkante von G k (4) falls x = a: (6) verlasse a auf einer unbenutzten Kante, (7) falls keine solche existiert, Stop. Satz 6 Der von dem obigen Algorithmus erzeugte Pfad ist eulersch. (1) die Regeln können eingehalten werden: sei x a der erreichte Knoten da d G (x) gerade, ist d Gk (x ) ungerade somit existiert immer eine Kante in G k, die mit x inzidiert ist d Gk (x) = 1, so kann x auf dieser Kante verlassen werden ist d Gk (x) > 1, so existiert mindestens eine Kante, die nicht Schnittkante in G k ist: 17 / 22 18 / 22 andernfalls existieren zwei Schnittkanten in G k, die x mit zwei Komponenten C und D verbinden: C (2) der in den ersten k Schritten erzeugte Graph ist der Anfang eines eulerschen Pfades: denn nach Erzeugen eines Knotens x a existieren genau zwei Knoten (x und a) in G k, die ungeraden Grad haben x D nach Korollar 4 existiert dann noch ein Pfad in G k, der semi-eulersch ist. d Gk (x) ist ungerade, die Anzahl der ungeraden Knoten in C aber gerade damit muss C noch einen weiteren ungeraden Knoten enthalten entsprechend D Der Algorithmus kann so implementiert werden, dass er eine lineare Laufzeit von O( V + E ) hat. Wir beschreiben im folgenden eine rekursive Version zur Berechnung von Euler-Touren: da G k aber genau zwei Knoten mit ungeradem Grad hat (den Startknoten a und den Knoten x), liefert dies einen Widerspruch. 19 / 22 20 / 22
rekursiver Algorithmus zur Bestimmung eines Euler-Kreiese (1) wähle ein v 1 V beliebig (2) W = Euler(G, v 1 ) Euler(G, v ) (1) setze W = v und x = v (2) falls δ(x) = gehe zu (5) (3) andernfalls wähle e = (x, y ) δ(x ) (4) setze W = W, e, y und x = y setze E = E e gehe zu (2) für das Chinese-Postman-Problem und andere Fragestellungen wird es von Interesse sein, einen Graphen G = (V, E ) durch Hinzufügen von Kanten eulersch zu machen dazu benötigen wir noch einige andere Hilfsmittel, die wir in einem späteren Kapitel behandeln werden. (5) sei W = v 1, e 1, v 2, e 2,..., v k, e k, v k +1 (6) für i = 1 bis k do (7) sei W i = Euler(G, v i ) end do (8) setze W = W 1, e 1, W 2, e 2,..., W k, e k, v k +1 (9) return 21 / 22 22 / 22