2.) Algorithmus von Fleury 2.1 Einleitung Der Algorithmus

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