2.) Algorithmus von Fleury 2.1 Einleitung Der Algorithmus von Fleury bietet sich an, wenn man in einem Graphen einen Eulerweg oder einen Eulerkreis finden möchte. Im Folgenden reden wir nur von einfache (keine mehrfache Kanten) endlichen Graphen. 2.2 Wiederholung Definition: Ein Eulerkreis (geschl. Eulerzug, Eulertour) ist ein Zyklus, der in einem Graphen alle Kanten genau einmal durchläuft. Ein Eulerweg (offener Eulerzug, Eulerpfad) ist dann gegeben, wenn der Start- und Endpunkt nicht ident sind, d.h. statt eines Zyklus wird nur ein Weg verlangt. Ein zusammenhängender Graph, welcher einen Eulerkreis besitzt, bezeichnet man als Eulerschen Graphen. Satz von Euler: Ein zusammenhängender Graph ist genau dann ein Eulerscher Graph, wenn der Grad jeder Ecke gerade ist. Beweis: siehe Skriptum. 2.3 Algorithmus von Fleury Im Algorithmus von Fleury spielen Brücken eine wichtige Rolle. Das sind Kanten, ohne die der Graph in zwei Komponenten zerfallen würde. Der Algorithmus konstruiert nun einen Eulerweg oder einen Eulerkreis in einem endlichen Graphen G: 1.) Wähle eine beliebige Ecke als Startpunkt. 2.) Wähle nun eine benachbarte Ecke und entferne dabei die durchlaufene Kante, dabei sind aber zuerst Kanten zu wählen die keine Brücken sind. Dabei erhalten wir nun einen neuen Graphen G’. 3.) Falls G’ keine Ecke enthält, dann haben wir einen Eulerschen Weg gefunden. Ansonsten wendet man wieder 2.) auf den neuen Graphen G’ an usw. 4.) Wenn zuletzt der Endpunkt und der Startpunkt ident sind so erhält man dadurch einen Eulerkreis. Bisher haben wir nur ungerichtete Graphen behandelt, wo es einen Eulerweg gibt, wenn die Anzahl der Ecken mit ungeradem Grad gleich zwei ist. Ein Eulerkreis existiert, wenn es keine einzige Ecke mit ungeradem Grad gibt. Bei gerichtete Graphen handelt es sich genau dann um Eulersche Graphen, wenn sie symmetrisch sind, zugleich entsprechen sie dann einem ungerichteten Graphen. Laufzeit: Ob eine Kante eine Brückenkante ist kann mittels Tiefensuche in Laufzeit O(|E|) überprüft werden. Da pro Schritt eine Kante entfernt wird, benötigen wir |E| Iterationen. Die Anzahl der pro Iteration geprüften Kanten entspricht dem Grad des aktuellen Knotens. Insgesamt kann man die gesamte Anzahl überprüfter Kanten durch O(|E|) beschränken. Somit ergibt sich eine gesamte Laufzeit von O(|E|2). 2.4 Anwendungsbeispiele 1.) Königsberger Brückenproblem Die Punkte sind die Stadtteile und die Kanten sind die Brücken. Durch Probieren wird man leicht herausfinden, dass es nicht möglich ist, alle Stadtteile hintereinander zu besuchen und jede Brücke nur ein einziges Mal zu benutzen. Es gibt also keinen Eulerweg und demzufolge auch keinen Eulerkreis. Warum ist das so? Euler hat die folgende Gesetzmäßigkeit entdeckt: Wenn in einem Graphen ein Eulerweg existiert, dann haben maximal 2 Knoten ungeraden Grad. Beim Königsberger Brückengraphen gibt es vier Knoten mit ungeradem Grad. Deshalb ist der Stadtrundgang mit dem nur einmaligen Benutzen jeder Brücke unmöglich. Ein ungerader Knoten ist entweder Anfang oder Ende des Weges über die Brücken: null ungerade Knoten würde bedeuten, dass Anfang und Ende des Weges in Königsberg identisch sind. Ein Weg mit Anfang und Ende hätte maximal zwei ungerade Knoten. Also ist es in Königsberg nicht möglich gewesen, alle Brücken in einem Wege nur jeweils einmal zu begehen. 2.) „Das ist das Haus vom Nikolaus“ Das Kinderrätsel hingegen enthält einen Eulerweg, aber keinen Eulerkreis, da der Graph zwei Ecken mit dem Grad von 3 enthält. Ein Eulerweg ist z.B. 1-2-4-3-1-4-5-3-2. Knoten 1 und 2 haben jeweils 3 Nachbarn, ihr Grad ist ungerade. 2.5 Alternative: Hierholzer Euler zeigte, dass in jedem Eulerschen Graphen alle Ecken geraden Grad haben. Hierholzer zeigte danach aber die Umkehrung, dass in jeden zusammenhängenden Graphen, in dem jede Ecke einen geraden Grad besitzt, ein Eulerkreis existiert und in jedem Graphen, in dem zwei Ecken ungeraden Grad haben, ein Eulerweg existiert. Der Algorithmus von Fleury verfolgt zwar einen sehr einfachen Ansatz, effizienter ist jedoch der Algorithmus von Hierholzer. Er basiert darauf, dass sich ein Eulscher Graph in paarweise kantendisjunkte Kreise zerlegen lässt. Wir gehen nun von einem Eulerschen Graphen G aus: 1.) Wähle eine beliebige Ecke als Startpunkt und konstruiere von ihm ausgehend einen Unterkreis in G, der alle Eigenschaften eines Eulerkreises besitzt. 2.) Vernachlässige nun alle Kanten dieses Unterkreises. 3.) Am ersten Eckpunkt des ersten Unterkreises, dessen Grad größer 0 ist, lässt man nun einen weiteren Unterkreis entstehen, der wiederum ein Eulerkreis ist. 4.) Erstelle so viele Unterkreise, bis alle Kanten von einem Unterkreis durchlaufen wurden. 5.) Nun erhält man den Eulerkreis, indem man mit dem ersten Unterkreis beginnt und bei jedem Schnittpunkt mit einem anderen Unterkreis, den letzteren einfügt, und danach den ersten Unterkreis wieder bis zu einem weiteren Schnittpunkt oder dem Endpunkt fortsetzt. Beispiel: Wir gehen nun von einem zusammenhängenden Graphen aus, dessen Ecken alle geraden Grad haben. J K Wir wählen nun z.B. A als unseren Start- und B H E Endpunkt aus, und erhalten somit die rot eingefärbte D F Sichel mit den Kantenzug: A,B,D,F,H,I,J,E,K,A. Anschließend gehen wir unseren Unterkreis bis zu G dem ersten Punkt, der nach Vernachlässigung der I bereits benutzten Kanten einen Grad größer als 0 A besitzt. Dies ist hier der Punkt B. Damit suchen wir nun einen Unterkreis mit Anfangs- und Endpunkt B, J K B und erhalten die grüne Sichel mit den Kantenzug: H E B,C,D,E,F,G,H,J,K,B. Somit ist jede Kante in einem D F Unterkreis vorhanden und erhalten nun einen Eulerkreis. Man beginnt mit dem ersten Unterkreis G bis zum Startpunkt des Zweiten. Verfolgt zuerst den Zweiten und vervollständigt erst danach den Ersten. Damit ergibt sich nun ein Eulerkreis mit A,B,C,D,E,F,G,H,J,K,B,D,F,H,I,J,E,K,A. A C C I Laufzeit: Die Implementierung ist in einer Laufzeit von O(|V|+|E|) realisierbar, sprich der Eulerkreis wird in Linearzeit berechnet.