Chapter 5 - BFH-TI Staff

Werbung
Graphen
Pierre Fierz
Chapter 5
Einleitung
Graphen
Begriffe
Der Graph als ADT
Lecture Algorithmen & Datenstrukturen
18.09.2012
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
Pierre Fierz
Berner Fachhochschule
Technik und Informatik
5.1
Contents
Graphen
Pierre Fierz
1 Einleitung
Einleitung
2 Begriffe
3 Der Graph als ADT
4 Implementation von Graphen
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
5 Algorithmen auf Graphen
6 Gewichtete Graphen
7 Flussgraphen
8 Maximaler Fluss
5.2
Outline
Graphen
Pierre Fierz
1 Einleitung
Einleitung
2 Begriffe
3 Der Graph als ADT
4 Implementation von Graphen
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
5 Algorithmen auf Graphen
6 Gewichtete Graphen
7 Flussgraphen
8 Maximaler Fluss
5.3
Graphen
Einleitung
• Sehr viele Probleme können auf natürliche Weise mit Hilfe
von Objekten und Verbindungen zwischen diesen
Objekten dargestellt werden.
Pierre Fierz
Einleitung
Begriffe
Beispiel: Klassische Probleme
Der Graph als ADT
• Königsberger Brückenproblem (Euler 1736):
Gibt es einen Spaziergang so, dass jede Brücke in der
folgenden Abbildung genau einmal begangen wird und
dass man sich am Schluss wieder am Ausgangspunkt
befindet?
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
B
Fluss
A
D
C
• Hamilton Problem (Hamilton 1859):
Kann ein Graph (Netz) derart durchlaufen werden, dass
jeder Knoten genau einmal besucht wird?
5.4
Einleitung 2
Graphen
Pierre Fierz
Angewandte Probleme
• Finden eines kürzesten und eines billigsten Weges von
einer Stadt zu einer anderen.
Einleitung
Begriffe
Der Graph als ADT
• Erstellen eines Netzplanes für die Projektplanung, so dass
die Abfolge von Tätigkeiten logisch richtig ist. Finde in
diesem Netzplan einen Lösungsweg so, dass das Projekt
in minimaler Zeit fertiggestellt werden kann.
• Darstellung von Petrinetzen.
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
• Färben der Länder in einer Landkarte mit einer minimalen
Anzahl Farben.
• Darstellung der Verknüpfung der Atome in einem Molekül.
• Finden der optimalen Verkabelung für einen Neubau.
• Erstellen von Verkehrsleitsystemen, die Autos auf dem
schnellstmöglichen Weg zum Ziel führen.
• usw.
5.5
Outline
Graphen
Pierre Fierz
1 Einleitung
Einleitung
2 Begriffe
3 Der Graph als ADT
4 Implementation von Graphen
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
5 Algorithmen auf Graphen
6 Gewichtete Graphen
7 Flussgraphen
8 Maximaler Fluss
5.6
Gerichtete Graphen
Graphen
Pierre Fierz
• Wir definieren als erstes gerichtete Graphen
Einleitung
Definition (Gerichteter Graph)
Begriffe
Ein gerichteter Graph G = (V , E) besteht aus:
Der Graph als ADT
1
2
einer Menge V von Knoten (engl: vertices) und
einer binären Relation E auf V . Die Elemente (u, v ) von E
werden gerichtete Kanten (engl: edges) des gerichteten
Graphen genannt.
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
Falls (u, v ) eine Kante des Graphen ist so sagt man, dass die
Knoten u und v adjazent sind.
Eine Kante e heisst inzident zum Knoten u, falls u einer der
Endpunkte der Kante ist.
• In Texten ist es üblich, für eine gerichtete Kante (u, v )
u → v zu schreiben.
5.7
Graphen
Gerichtete Graphen 2
Pierre Fierz
Beispiel: Graphische Darstellung von Graphen
• Gerichtete Graphen können graphisch dargestellt werden.
• Jeder Knoten wird durch einen Kreis und einen Namen
dargestellt und jede Kante durch einen Pfeil.
Einleitung
Begriffe
Der Graph als ADT
Implementation von
Graphen
Gerichteter Graph
Algorithmen auf
Graphen
Gewichtete Graphen
V = {0, 1, 2, 3, 4}
E = {(0,0), (0,2), (1,0), (1,4), (2,1), (2,3), (3,1), (4,2) (4,3)}
Flussgraphen
Maximaler Fluss
0
1
4
2
3
5.8
Gerichtete Graphen 3
Graphen
Pierre Fierz
Einleitung
Begriffe
Definition (Vorgänger und Nachfolger)
Wenn u → v eine gerichtete Kante ist, so ist u ein Vorgänger
(engl: predecessor) von v und entsprechend ist v ein
Nachfolger (engl: successor) von u.
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
• Im vorherigen Beispiel bedeutet die gerichtete Kante
Maximaler Fluss
1 → 0, dass 0 ein Nachfolger von 1 ist.
• Die gerichtete Kante 0 → 0 bedeutet, dass 0 sowohl sein
eigener Vorgänger wie auch sein eigener Nachfolger ist.
5.9
Graphen
Gerichtete Graphen 4
Pierre Fierz
Definition (Pfad in gerichteten Graphen)
Ein Pfad (engl: path) in einem gerichteten Graphen ist eine Liste von Knoten
(v1 , v2 , . . . , vk ) so, dass von jedem Knoten zum nächsten Knoten in der Liste
eine gerichtete Kante existiert. Das heisst, vi → vi+1 i = 1, 2, . . . , k − 1
Einleitung
Begriffe
Der Graph als ADT
Die Länge des Pfades ist die Anzahl der gerichteten Kanten im Pfad also k − 1.
Der triviale Fall k = 1 ist auch erlaubt. Das heisst, jeder Knoten v ist für sich
ein Pfad der Länge 0 von v nach v .
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Beispiel: Pfade im Graph
Maximaler Fluss
0
1
2
3
4
• (1, 0, 2, 3) ist ein Pfad der Länge 3.
• (2, 1, 4) ist ein Pfad der Länge 2.
5.10
Gerichtete Graphen 5
Graphen
Pierre Fierz
Einleitung
Definition (Zyklus)
• Ein Zyklus (engl: cycle) in einem gerichteten Graphen ist
ein Pfad der Länge ≥ 1, mit gleichem Begin- und
Endknoten.
• Ein Zyklus (v1 , v2 , . . . , vk , v1 ) heisst einfach (engl: simple),
wenn die Knoten v1 , v2 , . . . , vk alle verschieden sind.
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
• Ein Zyklus der Länge 1 heisst auch Schlinge (engl: loop).
• Ein Graph heisst zyklisch (engl: cyclic), wenn er ein oder
mehrere Zyklen enthält sonst azyklisch (engl: acyclic).
5.11
Graphen
Gerichtete Graphen 6
Pierre Fierz
Beispiel: Zyklen im Graph
Einleitung
Begriffe
Der Graph als ADT
0
1
Implementation von
Graphen
4
Algorithmen auf
Graphen
2
3
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
• (1, 4, 3, 1) ist ein einfacher Zyklus.
• (2, 1, 0, 0, 2) ist ein Zyklus der nicht einfach ist.
Theorem (Knoten in Zyklen)
Jeder Knoten, der in einem Zyklus enthalten ist, ist auch in
einem einfachen Zyklus enthalten.
5.12
Ungerichtete Graphen
Graphen
Pierre Fierz
• In vielen Fällen macht es Sinn, Knoten über ungerichtete
Kanten zu verbinden.
• In diesem Fall spricht man von ungerichteten Graphen.
Definition (Ungerichteter Graph)
Ein ungerichteter Graph (engl: undirected graph) G = (V , E)
besteht aus einer Menge von Knoten V und einer Menge von
ungerichteten Kanten E. Eine Ungerichtete Kante ist eine
Menge {u, v }, die genau zwei Knoten enthält.
Einleitung
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
Falls {u, v } eine ungerichtete Kante ist sagt man, dass die
Knoten u und v adjazent sind.
Eine Kante e heisst inzident zum Knoten u, falls u einer der
Endpunkte der Kante ist.
5.13
Graphen
Ungerichtete Graphen 2
Pierre Fierz
Beispiel: Bahnverbindungen als ungerichteter Graph
• In der folgenden Abbildung sind einige Bahnverbindungen
zwischen Städten als Graphen dargestellt.
• In diesem Fall ist es Sinnvoll mit einem ungerichteten
Graphen zu arbeiten, da die Züge immer in beide
Richtungen fahren können.
Einleitung
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
K = {Bern, Lausanne, Genf, Thun, Brig, Sion}
E = {{Lausanne,Genf}, {Lausanne,Sion},{Lausanne,Bern},{Bern,Thun},{Thun,Brig},{Brig,Sion}}
Maximaler Fluss
Bern
Thun
Lausanne
Brig
Genf
Sion
5.14
Ungerichtete Graphen 3
Graphen
Pierre Fierz
Einleitung
Definition (Pfad in ungerichteten Graphen)
Begriffe
Der Graph als ADT
Ein Pfad in einem ungerichteten Graphen ist eine Liste von
Knoten (v1 , v2 , . . . , vk ) so, dass von jedem Knoten zum
nächten Knoten in der Liste eine ungerichtete Kante existiert.
Das heisst, {vi , vi+1 } ∈ E i = 1, 2, . . . , k − 1
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Die Länge des Pfades ist die Anzahl der ungerichteten Kanten
im Pfad also k − 1.
Maximaler Fluss
Der triviale Fall k = 1 ist auch erlaubt. Das heisst, jeder
Knoten v ist für sich ein Pfad der Länge 0 von v nach v .
5.15
Graphen
Ungerichtete Graphen 4
Pierre Fierz
Bern
Thun
Einleitung
Lausanne
Brig
Genf
Sion
Begriffe
Der Graph als ADT
Implementation von
Graphen
• Die Definition von Zyklen in ungerichteten Graphen ist
etwas schwieriger als in gerichteten Graphen.
• Im Beispiel wollen wir den Pfad
(Genf,Lausanne,Sion,Brig,Sion,Lausanne,Genf) sicher
nicht als Zyklus betrachten.
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
• Wir müssen diesen Fall also ausschliessen.
Definition (Zyklus im ungerichteten Graphen)
Ein einfacher Zyklus in einem ungerichteten Graphen ist ein
Pfad (v1 , v2 , . . . , vk , v1 ) der Länge ≥ 3 der im gleichen Knoten
beginnt und endet, wobei die Knoten v1 , v2 , . . . , vk alle
verschieden sind.
5.16
Outline
Graphen
Pierre Fierz
1 Einleitung
Einleitung
2 Begriffe
3 Der Graph als ADT
4 Implementation von Graphen
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
5 Algorithmen auf Graphen
6 Gewichtete Graphen
7 Flussgraphen
8 Maximaler Fluss
5.17
Bemerkungen zum Graph
Graphen
Pierre Fierz
• Der Graph ist eine komplexere Datenstruktur als die
Datenstrukturen, die wir bis jetzt behandelt haben.
Einleitung
Begriffe
• Diese Komplexität kommt daher, dass Graphen aus
Knoten und Kanten bestehen.
• Ferner gibt es ja ungerichtete und gerichtete Graphen was
die Beschreibung nicht unbedingt erleichtert.
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
• Letzteres Problem kann mit Hilfe von Vererbung gelöst
Maximaler Fluss
werden.
• Wir definieren die abstrakte Klasse Graph mit zwei
Subklassen DirectedGraph und UndirectedGraph.
• Da sowohl für Knoten wie auch für Kanten
Zusatzinformationen existieren können, speichern wir zu
jedem Knoten und zu jeder Kante ein Object o.
5.18
Graphen
Die Klasse Graph
Pierre Fierz
Informations Methoden des Graphen
Einleitung
verticeCount():
edgeCount():
vertices():
edges():
endVertices(e):
areAdjacent(v,w):
getEdge(v,w):
Gibt die Anzahl Knoten des Graphen zurück
Gibt die Anzahl Kanten zurück
Gibt einen Iterator über die Knoten zurück
Gibt einen Iterator über die Kanten zurück
Gibt die beiden Endknoten einer Kante zurück
Gibt zurück, ob die Knoten v un w adjazent sind.
Gibt die Kante zwischen v und w zurück.
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
Methoden zum Verändern des Graphen
abstract insertEdge(v,w,o):
insertVertex(o):
removeEdge(e):
removeVertex(v):
Einfügen einer Kante.
Einfügen eines Knotens
Löscht die Kante e.
Löscht den Knoten v und alle
inzidenten Kanten.
5.19
Die Klasse Directedgraph
Graphen
Pierre Fierz
• Diese Methoden sind nur für einen gerichteten Graphen
sinnvoll.
Einleitung
Begriffe
• Man beachte, dass die Methode insertEdge() hier
speziell für gerichtete Graphen implementiert wird.
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Methoden vom gerichteten Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
insertEdge(v,w,o):
origine(e):
destination(e):
inIncident(v):
outIncident(v):
Einfügen einer gerichteten Kante von v nach w.
Gibt den Anfangspunkt der Kante zurück.
Gibt den Endpunkt der Kante zurück.
Gibt einen Iterator über alle eingehenden Kanten
von v zurück.
Gibt einen Iterator über alle ausgehenden Kanten von v zurück.
5.20
Die Klasse Undirectedgraph
Graphen
Pierre Fierz
Einleitung
• Diese Methoden sind nur für einen ungerichteten Graphen
sinnvoll.
Begriffe
Der Graph als ADT
• Man beachte, dass die Methode insertEdge() auch
hier speziell für ungerichtete Graphen implementiert wird.
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Methoden vom gerichteten Graphen
Flussgraphen
Maximaler Fluss
insertEdge(v,w,o):
incident(v):
Einfügen einer ungerichteten Kante zwischen v
und w.
Gibt einen Iterator über alle zu v inzidenten Kanten zurück.
5.21
Outline
Graphen
Pierre Fierz
1 Einleitung
Einleitung
2 Begriffe
3 Der Graph als ADT
4 Implementation von Graphen
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
5 Algorithmen auf Graphen
6 Gewichtete Graphen
7 Flussgraphen
8 Maximaler Fluss
5.22
Allgemeines
Graphen
Pierre Fierz
Einleitung
Begriffe
Der Graph als ADT
• Es gibt zwei verschiedene “standards” um Graphen im
Computer darzustellen.
1
2
Die eine ist die Adjazenzliste, die ganz allgemein zur
Darstellung von binären Relationen verwendet wird und
die Adjazenzmatrix
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
• Welche Darstellung Sinnvoll ist hängt vom betrachteten
Graphen und von den gewünschten Operationen ab.
5.23
Graphen
Die Adjazenzliste
Pierre Fierz
• Bei dieser Darstellung wird zu jedem Knoten eine
verkettete Liste aller Nachfolger geführt.
Einleitung
Beispiel: Ein Graph und die entsprechende Adjazenzliste
Begriffe
Der Graph als ADT
Implementation von
Graphen
0
Algorithmen auf
Graphen
1
Gewichtete Graphen
4
Flussgraphen
Maximaler Fluss
2
0
1
2
3
4
3
0
0
1
2
4
3
1
2
3
5.24
Graphen
Die Adjazenzliste 2
Pierre Fierz
• Falls der Graph ungerichtet ist, werden die Knoten einfach
symetrisch in den Listen aufgenommen.
Einleitung
Begriffe
Beispiel: Ein ungerichteter Graph und die entsprechende
Adjazenzliste
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Bern
Gewichtete Graphen
Thun
Flussgraphen
Lausanne
Maximaler Fluss
Brig
Genf
Bern
Lausanne
Genf
Sion
Thun
Brig
Sion
Lausanne
Bern
Lausanne
Brig
Bern
Sion
Thun
Genf
Sion
Lausanne
Brig
Thun
5.25
Graphen
Die Adjazenzmatrix
Pierre Fierz
• In dieser Implementation wird der Graph einfach als
Boolsche-Matrix dargestellt.
• Der eintrag arcs[u, v ] ist wahr, wenn eine gerichtete Kante
u → v im Graphen existiert.
Einleitung
Begriffe
Der Graph als ADT
Beispiel: Ein Graph und die entsprechende Adjazenzmatrix
Implementation von
Graphen
Algorithmen auf
Graphen
0
1
Gewichtete Graphen
Flussgraphen
4
Maximaler Fluss
2
0
1
2
3
4
3
0
1
1
0
0
0
1
0
0
1
1
0
2
1
0
0
0
1
3
0
0
1
0
1
4
0
1
0
0
0
5.26
Graphen
Die Adjazenzmatrix 2
Pierre Fierz
• Für ungerichtete Graphen ist die Adjazenzmatrix immer
symmetrisch.
• Die Diagonale ist immer 0, da keine Schlingen existieren.
Einleitung
Begriffe
Beispiel: Ein ungerichteter Graph und die entsprechende
Adjazenzmatrix
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Bern
Gewichtete Graphen
Thun
Lausanne
Flussgraphen
Maximaler Fluss
Brig
Genf
Bern
Lausanne
Genf
Sion
Thun
Brig
Bern
0
1
0
0
1
0
Sion
Lausanne
1
0
1
1
0
0
Genf
0
1
0
0
0
0
Sion
0
1
0
0
0
1
Thun
1
0
0
0
0
1
Brig
0
0
0
1
1
0
5.27
Vergleich der Methoden
Graphen
Pierre Fierz
• Im allgemeinen wird die Adjazenzmatrix dann bevorzugt,
wenn der Graph dicht (engl: dense) ist.
• D. h., die Anzahl Kanten des Graphen ist fast maximal
(das Maximum für einen gerichteten Graphen mit n
Knoten ist n2 ).
• Die Komplexität der Traversierung für einen Graphen
G = (V , E) gleich O(|V | · |V |)
Einleitung
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
• Die adjazenzliste wird dann angewendet, wenn der Graph
licht (engl: sparse) ist.
• D.h., der Graph hat viele Knoten aber nur wenig Kanten.
• Der Vorteil ist, dass bei grossen lichten Graphen weniger
Platz verwendet wird.
• Ferner ist die Komplexität der Traversierung für einen
Graphen G = (V , E) gleich O(|V | + |E|).
5.28
Outline
Graphen
Pierre Fierz
1 Einleitung
Einleitung
2 Begriffe
3 Der Graph als ADT
4 Implementation von Graphen
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
5 Algorithmen auf Graphen
6 Gewichtete Graphen
7 Flussgraphen
8 Maximaler Fluss
5.29
Traversieren eines Graphen
Graphen
Pierre Fierz
Einleitung
Begriffe
Der Graph als ADT
• Ein Graph kann im Wesentlichen auf zwei Arten traversiert
werden
1
2
Mittels Tiefensuche oder
mittels Breitensuche
• Die Tiefensuche kann mit der rekursiven Traversierung
von Bäumen verglichen werden.
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
• Die Breitensuche wird angewandt, wenn die kürzesten
Pfade von einem Knoten zu den anderen gesucht wird.
5.30
Tiefensuche (Depth-First Search)
Graphen
Pierre Fierz
• Die Tiefensuche beginnt bei einem Knoten und besucht
alle seine Nachfolger mit Hilfe der Tiefensuche.
• Das einzige Problem ist, dass diese Methode für zyklische
Graphen unendlich ist.
Einleitung
Begriffe
Der Graph als ADT
• Wir müssen daher alle Knoten die besucht werden speziell
markieren, damit diese nur einmal besucht werden.
Rekursive Traversierung
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
boolean arc[][] = new boolean[KMAX][KMAX];
boolean visited[] = new boolean[KMAX];
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
public void search() {
for (int i = 0; i < KMAX; i++)
visited[i] = false;
for (int i = 0; i < KMAX; i++)
if (visited[i] == false)
visit(i);
}
private void visit(int k) {
visited[k] = true;
// Knoten behandeln
for (int i = 0; i < KMAX; i++)
if (arc[k][i] == true)
if (visited[i] == false)
visit(i);
}
5.31
Tiefensuche 2
Graphen
Pierre Fierz
Einleitung
Begriffe
• Die Tiefensuche kann natürlich auch ohne Rekursion
implementiert werden
• Wir brauchen dazu lediglich einen Stack
Implementation mit einem Stack
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
1
2
Knoten k als besucht markieren und auf den Stack legen.
Solange der Stack nicht leer ist:
Maximaler Fluss
1 k = pop
2 Alle unmarkierten Nachfolger kn von k als besucht
markierenund auf den Stack ablegen.
5.32
Breitensuche (Breath-First Search)
Graphen
Pierre Fierz
• Die Breitensuche entsteht dadurch, dass wir in der nicht
rekursiven Implementation der Tiefensuche den Stack
durch eine Warteschlange ersetzen.
• Nun werden zuerst alle ersten “Nachkommen” eines
Knotens besucht und dann alle “Nachkommen” der
zweiten Generation usw.
Einleitung
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Breitensuche
Flussgraphen
Maximaler Fluss
1
2
Knoten k als besucht markieren und in die Queue eintragen.
Solange die Queue nicht leer ist:
1 k = dequeue
2 Alle unmarkierten Nachfolger kn von k als besucht markieren
und in die Queue ablegen.
• Die oben angegebenen Algorithmen funktionieren sowohl
für gerichtete wie auch für ungerichtete Graphen.
5.33
Tiefensuch Wald
Graphen
Pierre Fierz
Einleitung
• Wir können verfolgen, in welcher Reihenfolge die Knoten
eines gerichteten Graphen bei der Tiefensuche
durchlaufen werden.
• Dabei kann für jeden Aufruf der Prozedur visit in
search ein Tiefensuchbaum folgendermassen definiert
werden:
• Wird die Prozedur visit für den Knoten v vom Knoten u
aus aufgerufen, so ist u ein direkter Vorgänger vom Knoten
v im Tiefensuchbaum.
• Die direkten Nachfolger von u werden von links nach rechts
im Baum eingetragen.
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
• Die Menge der so erhaltenen Tiefensuchbäume wird
Tiefensuchwald genannt.
5.34
Graphen
Tiefensuch Wald 2
Pierre Fierz
Beispiel: Ein gerichteter Graph und der entsprechende Suchwald
Einleitung
Begriffe
1
1
8
9
8
2
3
6
2
3
6
11
12
7
10
5
Der Graph als ADT
10
11
4
13
4
12
13
Implementation von
Graphen
9
5
7
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
• Wir können nun die Kanten eines Graphen G bezüglich
Maximaler Fluss
seines Tiefensuchwaldes in vier Kategorien aufteilen:
1
2
3
4
Baumkanten z. Bsp. 1 → 2
Vorwärtskanten: z. Bsp. 10 → 13
Rückwärtskanten: z. Bsp. 5 → 2, 7 → 1 und 8 → 8
Schlingen gelten auch als Rüchwärtskanten.
Querkanten: z. Bsp. 6 → 3 und 7 → 5
Alle Querkanten verlaufen im Baum von rechts nach links.
5.35
Postorder Nummerierung
• Die Postorder Nummerierung entsteht, wenn wir den
Tiefensuchwald in postorder traversieren.
• Die Knoten werden dabei in der Reihenfolge ihrer
Behandlung nummeriert.
• Dies können wir auch direkt während der Traversierung
tun.
Algorithmus Postorder Nummerierung
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
boolean arc[][] = new boolean[KMAX][KMAX];
boolean visited[] = new boolean[KMAX];
int postnr[] = new int[KMAX];
int k1;
Graphen
Pierre Fierz
Einleitung
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
public void search() {
for (int i = 0; i < KMAX; i++)
visited[i] = false;
k1 = 0;
for (int i = 0; i < KMAX; i++)
if (visited[i] == false)
visit(i);
}
private void visit(int k) {
visited[k] = true;
// Knoten behandeln
for (int i = 0; i < KMAX; i++)
if (arc[k][i] == true)
if (visited[i] == false)
visit(i);
// Postorder Nummer verteilen
++k1;
postnr[k] = k1;
5.36
Postorder Nummerierung 2
Graphen
Pierre Fierz
• Zwischen der Postordernummerierung der Knoten eines
Graphens und den vier Arten von gerichteten Kanten
besteht der folgende Zusammenhang.
1
2
3
Falls u → v eine Baumkante oder Vorwärtskante ist, so ist v
ein Nachfahre von u im Tiefenbaum und somit ist die
Postordernummer von v kleiner als die von u.
Falls u → v eine Querkante ist, so wissen wir, dass v links
von u im Baum liegt. Auch hier ist also die
Postordernummer von v kleiner als die von u.
Falls u → v eine Rückwärtskante ist und u 6= v , dann ist u
ein Nachkomme von v im Baum und hat daher eine kleinere
Postordernummer als v . Im Fall u = v ist die
Postordernummer gleich.
Einleitung
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
• Wir können also sagen, eine Kante u → v ist dann und nur
dann eine Rückwärtskante, wenn die Postordernummer
von u kleiner oder gleich der Postordernummer von v ist.
5.37
Finden von Zyklen in gerichteten Graphen
Graphen
Pierre Fierz
Theorem
Ein gerichteter Graph ist dann und nur dann zyklisch, wenn er
mindestens eine Rückwärtskante besitzt.
Einleitung
Begriffe
Der Graph als ADT
Proof.
Implementation von
Graphen
Falls eine Rückwärtskante existiert, ist nach Definition der
Rückwärtskante der Graph zyklisch.
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
v
u
Maximaler Fluss
Sei nun (v1 , v2 , . . . , vk , v1 ) ein Zyklus. Wir bezeichnen mit pi die
Postordernummer von vi
Falls keine der Kanten v1 → v2 bis vk −1 → vk eine
Rückwärtskante ist, so gilt p1 > p2 > · · · > pk .
Insbesondere gilt dann pk < p1 und somit ist die Kante vk → v1
eine Rückwärtskante.
5.38
Finden von Zyklen in gerichteten Graphen 2
Graphen
Pierre Fierz
Einleitung
Begriffe
• Wir können also einen Algorithmus schreiben, der
entscheidet ob ein gerichteter Graph zyklisch ist oder
nicht.
Entscheiden ob ein gerichteter Graph zyklisch ist
1
2
3
Führe die Tiefensuche auf den Graphen durch und
nummeriere die Knoten in postorder.
Für alle gerichteten Kanten u → v
Falls pu ≤ pv return zyklisch
return azyklisch
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
5.39
Topologisches Sortieren
• Gegeben sei ein gerichteter und azyklischer Graph G.
• Wir können mit der Tiefensuche jedem Knoten im
Graphen eine Postordernummer zuweisen.
• Wir sortieren nun die Knoten absteigend nach der
Postordernummer
• Wir erhalten dabei eine Liste (v1 , v2 , . . . , vn ) aller aller
Knoten des Graphen mit der folgenden Eigenschaft:
Für alle Kanten vi → vj des Graphen gilt i < j.
• Eine solche Ordnung heisst topologische Sortierung.
• Diese Ordnung wird etwa bei Netzplänen oder bei
Lehrplänen verwendet.
Graphen
Pierre Fierz
Einleitung
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
Beispiel: Topologische Ordnung
1
4
3
2
5
7
6
8
• Die topologische Ordnung ist im allgemeinen nicht eindeutig
• Im Beispiel ist sowohl die Liste (1, 5, 2, 3, 4, 6, 7, 8) wie auch
die Liste (1, 5, 2, 6, 3, 7, 4, 8) eine topologische Ordnung.
5.40
Topologisches Sortieren 2
Graphen
Pierre Fierz
Einleitung
Begriffe
Der Graph als ADT
• Mit Hilfe der Tiefensuche kann eine topologische Ordnung
einfach gefunden werden.
1
2
3
Führe die Tiefensuche durch
Nach der Zuweisung der Postordernummer wird jeder
Knoten auf einem Stack abgelegt
Am Ende können die Knoten vom Stack gelesen werden. In
dieser Reihenfolge bilden sie eine topologische Ordnung.
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
5.41
Zusammenhang in ungerichteten Graphen
Graphen
Pierre Fierz
• Gegeben sei ein ungerichteter Graph G und eine Relation
P auf der Menge K der Knoten des Graphen, die
folgendermassen definiert ist:
Einleitung
Begriffe
Der Graph als ADT
uPv ⇔ es existiert ein Pfad von u nach v
• Die Relatoion P ist eine Äquivalenzrelation, das heisst:
1 ∀u ∈ K : uPu (reflexiv)
2 ∀u, v ∈ K : uPv ⇔ vPu (symmetrish)
3 ∀u, v , w ∈ K : (uPv ∧ vPw) ⇒ uPw (transitiv)
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
Definition (Zusammenhangskomponenten)
Die durch die Relation P definierten Äquivalenzklassen eines
ungerichteten Graphen G heissen
Zusammenhangskomponenten von G.
Ein ungerichteter Graph G heisst zusammenhängend, wenn er
nur aus einer Zusammenhangskomponente besteht.
5.42
Zusammenhang in ungerichteten Graphen 2
Graphen
Pierre Fierz
• Mit Hilfe der Tiefensuche (und des Tiefenwaldes) können
•
•
•
•
die Zusammenhangskomponenten eines ungerichteten
Graphes gefunden werden.
Wir betrachten den ungerichteten Graphen als gerichtet.
jede ungerichtete Kante wird durch zwei entsprechende
gerichtete Kanten ersetzt.
un können wir den Tiefensuchwald für diesen Graph
konstruieren.
Die Menge der Bäume im Wald entspricht dann 1 zu 1 den
Zusammenhangskomponenten des Graphen.
Einleitung
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
Beispiel: Zusammenhangskomponenten
1
7
8
9
10
11
6
3
5
4
2
12
13
a) Ein ungerichteter Graph
1
2
4
7
3
5
10
8
9
11
6
12
13
b) Die Zusammenhangskomponenten
5.43
Zusammenhang in gerichteten Graphen
Graphen
Pierre Fierz
• In gerichteten Graphen unterscheidet man zwischen
schwach zusammenhängenden (weakly connected) und
stark zusammenhängenden Graphen (strongly
connected).
Einleitung
Begriffe
Der Graph als ADT
Implementation von
Graphen
Definition (schwach zusammenhängender gerichteter Graph)
Algorithmen auf
Graphen
Ein gerichteter Graph G heisst schwach zusammenhängend,
falls aus G durch das Ersetzen aller gerichteten Kanten durch
ungerichtete Kanten ein zusammenhängender ungerichteter
Graph G0 entsteht.
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
Definition (stark zusammenhängender gerichteter Graph)
Ein gerichteter Graph G heisst stark zusammenhängend, falls
für jedes Paar von Knoten u, v ∈ V sowohl ein gerichteter Pfad
von u nach v wie auch von v nach u existiert.
5.44
Zusammenhang in gerichteten Graphen 2
• Wie bei ungerichteten Graphen kann man dann von
schwachen und starken Zusammenhangskomponenten
sprechen.
• Eine starke Zusammenhangskomponente ist ein maximal
stark zusammenhängender Subgraph.
• Die starken Zusammenhangskomponenten können mit
Hilfe der Tiefensuche (Tiefensuchwald) ermittelt werden.
Ermitteln der starken Zusammenhangskomponenten in einem
gerichteten Graphen
1
2
3
Konstruiere den Tiefensuchwald von G = (V , E) und
nummeriere die Knoten in Postorder.
Konstruiere GT = (V , E T ) mit E T = {(u, v )|(v , u) ∈ E}
(Graph mit umgedrehten Kanten)
Konstruiere den Tiefensuchwald von GT . Wähle dabei den
Startknoten mit der höchsten Postordernummer (Schritt 1)
Graphen
Pierre Fierz
Einleitung
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
Theorem
u, v sind in der gleichen Zusammenhangskomponente ⇔ u, v
sind im gleichen Tiefensuchbaum.
5.45
Zusammenhang in gerichteten Graphen 3
Graphen
Pierre Fierz
Beispiel: Bestimmen der starken Zusammenhangskomponenten
Einleitung
• Bevor wir das Theorem beweisen betrachten das folgende
Begriffe
Der Graph als ADT
Beispiel.
Implementation von
Graphen
Tiefensuche auf G = (V , E)
Tiefensuche auf GT = (V , E T )
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
5.46
Zusammenhang in gerichteten Graphen 4
Graphen
Pierre Fierz
Proof.
Einleitung
Begriffe
• Wir beweisen zuerst ⇒:
Der Graph als ADT
• Nach Voraussetzung existieren in G Pfade von v nach u
Implementation von
Graphen
und von u nach v ⇒
T
• In G existieren auch Pfade von v nach u und von u nach
v.
• O.B.d.A. nehmen wir an, dass bei der Tiefensuche von
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
T
G , u vor v besucht wird.
• Da v vor dem Aufruf von visit(u) noch nicht besucht wurde
und es einen Weg von u nach v in GT gibt ⇒
• v wird innerhalb dieses Aufrufs gefunden und gehört somit
zum gleichen Tiefensuchbaum wie u.
5.47
Zusammenhang in gerichteten Graphen 5
Graphen
Pierre Fierz
Proof.
• Nun beweisen wir ⇐:
• Es genügt zu zeigen, dass alle Knoten v eines Tiefensuchbaumes mit
Wurzel x von GT in G in derselben Zusammenhangskomponente wie x
liegen.
• Nach Annahme existiert ein Pfad von x nach v in GT ⇒ es existiert einen
Pfad von v nach x in G.
• Es bleibt zu zeigen, dass ein Pfad von x nach v in G existiert.
• Nach Konstruktion ist die Postordernummer von v kleiner als die von x.
Einleitung
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
• Dies ist nur in zwei Fällen möglich:
1 In der Tiefensuche von G wird visit(v) vor visit(x) aufgerufen. Da in
G ein Pfad von v nach x existiert, muss der Aufruf von visit(x)
verschachtelt im Aufruf von visit(v) geschehen. Dann wäre aber die
Postordernummer von v grösser als die von x. Dies ist aber ein
Widerspruch. ⇒
2 In der Tiefensuche von G wird visit(v) verschachtelt in visit(x)
aufgerufen ⇒ es existiert ein Pfad von x nach v in G.
5.48
Outline
Graphen
Pierre Fierz
1 Einleitung
Einleitung
2 Begriffe
3 Der Graph als ADT
4 Implementation von Graphen
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
5 Algorithmen auf Graphen
6 Gewichtete Graphen
7 Flussgraphen
8 Maximaler Fluss
5.49
Gewichtete Graphen
Graphen
Pierre Fierz
• Bei vielen Problemen, die mit Hilfe von Graphen gelöst
werden, spielt die Länge (oder die Kosten) der Kanten
eine wichtige Rolle.
Beispiel: Gewichteter Graph
• Ein Transportunternehmen wird versuchen, die Länge der
•
•
•
•
Wege zwischen Startort und Zielort zu minimieren.
Wir können nun die Strassenkarte als Graphen modelieren.
Als Knoten nehmen wir die Ortschaften.
Als Kanten nehmen wir die Strassen. Jedem
Strassenabschnitt wird als Gewicht die Distanz zwischen
zwei Ortschaften zugewiesen.
Nun können wir in diesem Graphen den kürzesten Pfad
zwischen Startort und Zielort bestimmen.
Einleitung
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
5.50
Gewichtete Graphen 2
Graphen
Pierre Fierz
Definition (Gewichteter Graph)
Ein gewichteter Graph G = (V , E, w) ist ein gerichteter oder
ungerichteter Graph mit einer zusätzlichen Funktion w : E 7→ R
von der Menge der Kanten in die reellen Zahlen. Die Zahl w(e)
bezeichnet man als Gewicht der Kante e.
Einleitung
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
• Implementation von gewichteten Graphen
Adjazenzliste: Jedes Listenelement enthält zusätzlich das
Gewicht der Kante.
Adjazenzmatrix: Die Einträge in der Matrix sind
Doublezahlen, die das Gewicht der Kante
angeben. Wenn keine Kante existiert kann
in Java z.B. der Wert Double.NaN (Not a
Number) im Eintrag gespeichert werden.
Flussgraphen
Maximaler Fluss
5.51
Graphen
Minimal aufspanneder Baum
Pierre Fierz
• In Graphen taucht häufig das Problem auf, einen
minimalen aufspannenden Baum eines Graphen zu
finden.
Einleitung
Begriffe
Der Graph als ADT
Implementation von
Graphen
Definition
Gegeben sei ein ungerichteter, gewichteter und
zusammenhängender Graph G = (V , E, w).
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
0
0
0
Ein Untergraph G = (V , E , w/E ) von G mit folgenden
Eigenschaften heisst minimaler aufspannender Baum von G
(minimal spanning tree):
Maximaler Fluss
• G0 ist kreisfrei und zusammenhängend. Das heisst, G0 ist
ein Baum, der alle Knoten von G verbindet.
• G0 hat minimale Kosten. Das heisst, die Summe der
Gewichte der Kanten in G0 ist minimal.
5.52
Minimal aufspanneder Baum 2
• Der folgende Algorithmus stammt von Kruskal.
• Bei jedem Schritt wird die kürzeste Kante aus den noch
nicht betrachteten Kanten gewählt.
• Falls diese Kante zur Lösung hinzugefügt werden kann,
ohne das dadurch ein Kreis entsteht, wird dies getan.
• Sonst wird diese Kante nie mehr betrachtet.
• Der Algorithmus ist beendet, wenn wir |V | − 1 Kanten
gewählt haben.
Graphen
Pierre Fierz
Einleitung
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Beispiel: Algorithmus von Kruskal
Flussgraphen
Maximaler Fluss
2
1
8
3
5
3
3
4
4
3
1
7
6
7
6
2
8
8
3
3
8
5
3
3
4
1
7
5
10
6
7
7
6
7
9
4)
6
7
6
9
9
5)
6)
2
1
8
2
3
5
4
3
1
10
6
2
1
3
3
7
5
7
2
2
3
3
1
7
2
1
3
5
4
4
1
4
5
7
6
7
6
9
6
7
7)
3
3
4
5
10
7
3)
5
4
10
6
9
2
4
1
7
7
6
7
2
1
3
5
4
5
7
2)
2
4
1
7
10
6
9
1)
1
3
3
4
4
7
9
6
2
3
5
5
10
6
7
7
8
3
4
5
2
1
2
3
5
4
1
7
10
6
2
1
2
8
8)
5.53
Minimal aufspanneder Baum 3
Graphen
Pierre Fierz
• Nachfolgend Kruskal’s Algorithmus in Pseudocode
Einleitung
0
E = {}
while (|E 0 | < |V | − 1) {
suche in E eine Kante k mit w(k ) minimal.
E = E \ {k }
if (G0 = (V , E 0 ∪ {k }) hat keinen Kreis)
E 0 = E 0 ∪ {k }
}
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
• Der heikle Punkt im Algorithmus ist der Test ob kein Kreis
entsteht.
• Dazu müssen wir entscheiden können, ob zwei Punkte u
und v in der Gleichen Zusammenhangskomponente von
G liegen.
• Dies kann man mit Hilfe eines Waldes schnell
entscheiden.
5.54
Graphen
Minimal aufspanneder Baum 4
Pierre Fierz
• Die folgende Abbildung zeigt, wie die Bäume des Waldes
konstruiert werden.
Einleitung
Begriffe
Der Graph als ADT
Der Graph
2
1
8
8
3
5
3
3
4
3
5
1
7
6
7
6
2
8
3
3
4
4
7
9
4)
1
4
4
6
7
5
2
2)
Maximaler Fluss
3
6
3
2
6
2
4
7
6)
3
2
4
7
6
7
9
9
3)
1
1
4
5
6
7
6
Flussgraphen
7
1
7
2
5
5
5
2
3
1
5
7
6)
1
4
6
6
3
2
4
7
7
6
6
7
7)
5)
1
3
3
4
5
10
9
4)
2
1
3
3
7
7
2
2
5
4
4
6
1
6
1
3
3
7
10
6
5)
1
8
5
7
6
7
2
4
1
7
10
6
3
3
4
7
3
5
4
3
3
4
3
6
1)
2
1
8
5
7
2
3)
2
3
5
4
1
7
10
6
5
5
2
1
3
1
5
9
2)
2
5
1
6
7
Gewichtete Graphen
3
3
7
10
7
9
1)
1
3
5
4
6
7
9
8
Algorithmen auf
Graphen
2
4
5
10
6
7
7
8
3
3
4
5
10
Implementation von
Graphen
2
1
2
4
1
7
2
1
2
4
6
Die
Zusammenhangskomponenten
8)
5
7)
5.55
Minimal aufspanneder Baum 5
Wir müssen noch beweisen, dass der entstehende Baum ein minimaler
aufspannender Baum (MAB) ist.
Graphen
Pierre Fierz
Proof.
Einleitung
• Dass der entstehende Graph G0 ein aufspannender Baum liefert ist
trivial.
Begriffe
Der Graph als ADT
• Wir müssen noch beweisen, dass G0 minimal ist.
• Wir beweisen die folgende Aussage A mit Hilfe von Induktion.
Ist E 0 die Menge der gewählten Kanten nach n Schritten, so existiert ein
MAB, der E 0 enthält.
0
• Falls E = ∅, so gilt A trivialerweise.
• Sei E 0 die Menge der Kanten nach n Schritten und T ein MAB, der E 0
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
enthält. e sei die nächste vom Algorithmus ausgewählte Kante.
• Falls e ∈ T ist, so ist die Aussage A für E 0 + e auch wahr.
• Falls e ∈
/ T , dann existiert in T + e ein Zykus C und eine Kante
f ∈C∧f ∈
/ E 0 (sonst wäre C ⊆ E 0 + e) ⇒
• T 0 = T − f + e ist ein Baum und hat dasselbe Gewicht wie T , weil T minimal
ist und w(f ) ≥ w(e) (sonst hätte de Algorithmus f und nicht e ausgewählt).
• Das heisst, E 0 + e ist in T 0 enthalten und T 0 ist ein MAB.
• Das heisst A gilt am Ende des Algorithmus und das ist nur möglich wenn
E 0 ein MAB ist.
5.56
Graphen
Minimal aufspanneder Baum 6
Pierre Fierz
• Noch einige Bemerkungen zur Implementation:
• Um die Kanten nach Gewicht zu sortieren kann ein Heap verwendet
werden.
Einleitung
• Um den Wald zu konstruieren, kann ein Array verwendet werden.
Begriffe
Der Graph als ADT
Die Zusammenhangskomponenten
1
5
2
3
3
6
4
1
6
7
2
6
Gewichtete Graphen
Flussgraphen
1
1
Maximaler Fluss
6
2
3
6
7
2
1 2 3 4 5 6 7
−2 1 −2 −1 3 −1 −1
1
4
3
Algorithmen auf
Graphen
4
5
1 2 3 4 5 6 7
−1 −1 −2 −1 3 −1 −1
1
1
4
7
5
1 2 3 4 5 6 7
−1 −1 −1 −1 −1 −1 −1
3
Implementation von
Graphen
2
4
3
2
4
7
6
6
3
2
4
7
7
7
5
5
5
1 2 3 4 5 6 7
−4 1 1 −1 3 −1 −1
1 2 3 4 5 6 7
−5 1 1 1 3 −1 −1
1 2
−6 1
5
3 4 5 6 7
1 1 3 −1 1
1 2 3
−7 1 1
4 5
1 3
6
1
7
1
• Der Baum mit weniger Knoten wird immer an die Wurzel des Baumes mit
mehr Knoten angehängt.
• Der Weg von einem Knoten zur Wurzel wird zweimal durchlaufen.
• Beim zweiten Durchlauf werden alle Knoten auf dem Weg direkt an die
Wurzel angehängt.
• Dies bewirkt, dass die Bäume sehr flach bleiben.
5.57
Minimal aufspanneder Baum 7
Graphen
Pierre Fierz
• Nun noch zur Komplexität des Algorithmus:
• Zum Aufbauen des Heaps benötigt man O(|E|)
Operationen.
• Im schlechtesten Fall sind |E| Heapoperationen notwendig
also ist der Aufwand O(|E| log2 (|E|)).
• Man kann zeigen, dass die Komplexität für den Aufbau
des Waldes im schlechtesten Fall O(|E|α(|E|)) beträgt.
• Die Funktion α(|E|) wächst so langsam, dass diese als
Einleitung
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
konstant betrachtet werden kann.
• Es gilt: α(|E|) < 4 bis |E| so gross ist, dass
log2 (log2 (. . . 16mal . . . log2 (|E|) . . . )) > 1 ist.
• Also haben wir O(|E| + |E| log2 (|E|) + |E|α(|E|)). Falls α
als konstant angenommen wird gilt:
Komplexität(Kruskal) = O(|E| log2 (|E|))
5.58
Kürzeste Pfade in Graphen (Dijkstra)
Graphen
Pierre Fierz
Einleitung
Begriffe
Der Graph als ADT
• In gewichteten Graphen taucht sehr oft die Frage nach
dem kürzesten Pfad zwischen zwei Knoten u und v auf.
• Der Algorithmus von Dijkstra ist eine effiziente Methode
um die kürzesten Pfade von einem gegebenen Knoten
(der Source) zu allen anderen Knoten im Graphen zu
finden.
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
• Für die folgenden Betrachtungen nehmen wir an, dass
G = (V , E, w) ein ungerichteter oder gerichteter Graph ist.
5.59
Kürzeste Pfade in Graphen (Dijkstra) 2
• Wir wollen nun den Algorithmus von Dijkstra näher
erklären.
• Wir suchen alle kürzesten Pfade von einem Knoten s nach
allen anderen Knoten V .
• Wir unterteilen die Menge der Knoten V in die zwei
Mengen S und V \ S.
• In S sind alle Knoten enthalten, für die der kürzeste Pfad
schon gefunden wurde.
• Ein spezieller Pfad von s nach u ∈ V \ S ist ein Pfad der
Form (s, v1 , . . . , vn , u), wobei vi ∈ S i = 1 . . . n.
Graphen
Pierre Fierz
Einleitung
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
Spezielle Pfade
Graph G
V\S
S
s
v
u
spezieller Pfad
5.60
Kürzeste Pfade in Graphen (Dijkstra) 3
Graphen
Pierre Fierz
• Nun der Algorithmus
Einleitung
Algorithmus von Dijkstra
Begriffe
Der Graph als ADT
1
2
Setze S = {s} und dist(s) = 0
Für alle Knoten u ∈ V \ S setze
w(s → u)
dist(u) =
∞
Implementation von
Graphen
Algorithmen auf
Graphen
falls s → u ∈ E
sonst
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
3
4
5
Wähle den Knoten u ∈ (V \ S) mit dist(u) ist minimal.
u wird in S aufgenommen.
Für jeden zu u adjazenten Knoten z ∈ (V \ S) berechne
dist(z) nach folgender Formel:
dist(z) = min(dist(z), dist(u) + w((u, z)))
6
Falls V \ S 6= ∅ gehe zu 3.
5.61
Graphen
Kürzeste Pfade in Graphen (Dijkstra) 4
Pierre Fierz
Beispiel: Kürzeste Pfade finden
Wir wollen den Algorithmus an Hand des folgenden Graphen
verfolgen
Einleitung
Begriffe
Der Graph als ADT
1
100
Implementation von
Graphen
10
5
Algorithmen auf
Graphen
30
Gewichtete Graphen
60
2
Flussgraphen
10
Maximaler Fluss
4
50
3
gesetzt
1
2
4
3
5
Menge S
1
1,2
1,2,4
1,2,3,4
1,2,3,4,5
dist(2)
10/1
10/1
10/1
10/1
10/1
20
dist(3)
∞
60/2
50/4
50/4
50/4
dist(4)
30/1
30/1
30/1
30/1
30/1
dist(5)
100/1
100/1
90/4
60/3
60/3
5.62
Kürzeste Pfade in Graphen (Dijkstra) 5
Graphen
Pierre Fierz
Einleitung
• Wir wollen noch beweisen, dass der Algorithmus von
Dijkstra wirklich die kürzesten Pfade findet.
• Mittels Induktion über der Anzahle Knoten in S beweisen
wir die beiden folgenden Aussagen:
a) Für alle Knoten u in S ist dist(u) die Länge des kürzesten
Pfades von s nach u und alle Knoten des Pfades sind in S.
b) Für jeden Knoten u ∈ (V \ S) ist dist(u) die Länge eines
kürzesten speziellen Pfades von s nach u (∞ falls kein
spezieller Pfad existiert).
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
• Da am Ende des Algorithmus S = V ist, gilt die Aussage
a) für alle Knoten in G.
5.63
Kürzeste Pfade in Graphen (Dijkstra) 6
Graphen
Pierre Fierz
Proof.
•
•
k =1
Einleitung
Wenn k = 1 ist, so gehört nur s zu S. Da dist(s) = 0 gesetzt wird stimmt die
Aussage a).
Begriffe
Die einzigen speziellen Pfade sind die Kanten der Form s → u. Da in diesem Fall
dist(u) = w(s → u) gesetzt wird und für alle anderen Knoten auf ∞ stimmt die
Aussage b) auch.
Implementation von
Graphen
•
Wir nehmen an, dass a) und b) für k Elemente erfüllt sei. v sei das k + 1 Element,
dass in S aufgenommen wird.
Gewichtete Graphen
•
•
•
•
Wir müssen zeigen, dass dist(v ) die Länge des kürzesten Pfades von s nach v ist.
•
Wir nehmen an, dass es einen kürzeren weg gibt.
Der Graph als ADT
Algorithmen auf
Graphen
Flussgraphen
Maximaler Fluss
Nach Induktionsannahme kann das aber kein spezieller Pfad sein.
Wie die folgende Abbildung zeigt, muss dieser Pfad dann mindestens so lang sein
wie dist(v ).
G
S
v
s
w
u
5.64
Kürzeste Pfade in Graphen (Dijkstra) 7
Graphen
Pierre Fierz
Proof. (Forts.)
Einleitung
•
Es bleibt zu zeigen, dass b) nach dem Einfügen von v und der Korrektur der
Distanzen erhalten bleibt.
•
•
•
Wir betrachten irgend einen Knoten u ∈ (V \ S).
Der Graph als ADT
Ein kürzester spezieller Pfad von s nach u enthält immer einen vorletzten Knoten.
Implementation von
Graphen
Dieser Knoten ist entweder v oder ein anderer Knoten w ∈ S.
G
Begriffe
Algorithmen auf
Graphen
Gewichtete Graphen
S
v
u
Flussgraphen
s
w
•
•
Nach Induktionsannahme (Punkt a)) enthält der Pfad s nach w den Knoten v nicht.
•
Falls v der vorletzte Knoten im speziellen Pfad ist, so ist nach Konstruktion der Pfad
über v kürzer als der früherere spezielle Pfad und daher minimal.
•
Damit ist auch b) bewiesen.
Maximaler Fluss
Die Aufnahme von v in S verändert die Länge des speziellen Pfades s über w nach
u also nicht.
5.65
Kürzeste Pfade in Graphen (Dijkstra) 8
Graphen
Pierre Fierz
• Die einfachste Implementation von Dijkstra hat eine
Komplexität von O(|V |2 ).
• Mit Hilfe eines sogenannten Fibonacci Heaps kann die
Komplexität auf O(|V | log(|V |) + |E|) verbessert werden.
• Man sieht sofort, dass Dijkstra nur funktioniert, wenn alle
Kantengewichte positiv sind.
• Für Graphen mit negativen Kantengewichten existiert der
Allgorithmus von Bellman Ford.
Einleitung
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
• Der Graph darf dabei keine Kreise mit negativem Gewicht
enthalten, da sonst die Pfade das Gewicht −∞ haben
können.
• Der Algorithmus von Bellman und Ford findet die
kürzesten Pfade oder meldet, dass ein Kreis mit
negativem Gewicht existiert in der Zeit O(|V | · |E|).
5.66
Graphen
Kürzeste Pfade in Graphen (Floyd)
Pierre Fierz
• Der Algorithmus von Floyd findet die kürzesten Pfade
zwischen allen Knoten eines Graphen.
• Die Idee des Algorithmus von Floyd ist, jeden Knoten u
nacheinander als Charnier (Pivot) zu verwenden.
• Wenn u das Pivot ist, versuchen wir den Weg zwischen
beliebigen Knoten v und w zu verkürzen, indem wir einen
Weg über u wählen.
Einleitung
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Algorithmus von Floyd
Flussgraphen
Maximaler Fluss
1
2
3
u
d
n−1
e
v
f
w
• Die Distanz f zwischen v und w wird durch d + e ersetzt,
wenn diese Summe kleiner ist als f .
5.67
Kürzeste Pfade in Graphen (Floyd) 2
Graphen
Pierre Fierz
Der Algorithmus von Floyd
1 {
2
for (v = 0; v < MAX; v++) {
3
for (w = 0; w < MAX; w++) {
4
if (v == w) {
5
dist[v][w] = 0;
6
} else {
7
dist[v][w] = arc[v][w];
8
}
9
}
10
}
11
12
for (u = 0; u < MAX; u++) {
13
for (v = 0; v < MAX; v++) {
14
for (w = 0; w < MAX; w++) {
15
if (dist[v,u] + dist[u,w] < dist[v,w]) {
16
dist[v,w] = dist[v,u] + dist[u,w];
17
}
18
}
19
}
20
}
21 }
Einleitung
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
• In den Zeilen 2 bis 10 wird die Adjazenzmatrix arc in die
Distanzmatrix dist kopiert.
• In den Zeilen 12 bis 20 werden nacheinander alle Knoten
als Pivot verwendet und wenn nötig wird die Distanz
zwischen zwei Knoten wie oben beschrieben angepasst.
5.68
Graphen
Kürzeste Pfade in Graphen (Floyd) 3
Pierre Fierz
Beispiel: Floyd
0
90
Einleitung
10
4
Begriffe
30
Der Graph als ADT
65
1
Implementation von
Graphen
10
3
50
2
20
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
Ursprungsmatrix
0
1
2
3
4
0
0
∞
∞
∞
∞
0
1
2
3
4
0
0
∞
∞
∞
∞
1
10
0
∞
∞
∞
2
∞
50
0
20
∞
Pivot = 2
1
10
0
∞
∞
∞
2
60
50
0
20
∞
3
30
∞
∞
0
∞
4
90
∞
10
65
0
0
1
2
3
4
0
0
∞
∞
∞
∞
3
30
∞
∞
0
∞
4
70
60
10
30
0
0
1
2
3
4
0
0
∞
∞
∞
∞
Pivot = 1
1
10
0
∞
∞
∞
2
60
50
0
20
∞
Pivot = 3
1
10
0
∞
∞
∞
2
50
50
0
20
∞
3
30
∞
∞
0
∞
4
90
∞
10
65
0
3
30
∞
∞
0
∞
4
60
60
10
30
0
5.69
Kürzeste Pfade in Graphen (Floyd) 4
Graphen
Pierre Fierz
• Wir wollen noch beweisen, dass der Algorithmus von Floyd die kürzesten
Pfade liefert.
• Wir nehmen wieder an, dass die Knoten im Graphen von 0 bis n − 1
nummeriert sind.
• Ein k -Pfad von v nach w ist ein Pfad von v nach w, der keinen
Zwischenknoten enthält, der grösser als k ist. v und w hingegen sind
beliebieg.
• Ein (−1)-Pfad enthält nach Definition keine Zwischenknoten und kann
daher nur ein Pfad der Länge 0 oder 1 sein.
• Ein (n − 1)-Pfad kann beliebiege Knoten enthalten ist also ein beliebiger
Einleitung
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
Pfad des Graphen.
• Wir beweisen nun durch vollständige Induktion nach k die folgende
Aussage A(k ):
Bevor wir in den Zeilen 12 bis 20 in Floyds Algorithmus die Variable u auf k + 1
setzen, so steht in dist[v, w] die Länge des kürzesten k -Pfades von v nach
w oder ∞ falls kein solcher Pfad existiert (v , w = 0 . . . n − 1).
5.70
Kürzeste Pfade in Graphen (Floyd) 5
Graphen
Pierre Fierz
Proof.
Einleitung
Begriffe
Basis k = -1:
Gerade bevor wir u auf 0 setzen, haben wir die Matrix arc nach
dist kopiert (Zeilen 2 bis 10). Da die Kanten und Pfade der
Länge 0 die einzigen (−1)-Pfade sind gilt die behauptung für
k = −1. Induktionsschritt:
Wir nehmen nun an, A(k ) sei wahr und betrachten was
passiert, wenn die Variable u im Algorithmus den Wert k + 1
hat. Wir nehmen nun an, P sei ein kürzester (k + 1)-Pfad von
v nach w. Wir betrachten nun zwei Fälle.
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
1. Falls P ein k -Pfad ist so führt P nicht durch den Knoten
k + 1. Das heisst, nach Induktionsannahme enthält
dist[v , w] schon die Länge von P.
5.71
Graphen
Kürzeste Pfade in Graphen (Floyd) 6
Pierre Fierz
Proof. (Forts.)
Einleitung
2. P geht durch den Knoten k + 1. Dann setzt sich P aus
einem k -Pfad Q von v nach k + 1 und einem k -Pfad R von
k + 1 nach w zusammen
v
k−Pfad Q
k+1
k−Pfad R
w
Nach Induktionsannahme enthalten dist[v , k + 1] und
dist[k + 1, w] die Längen von Q respektive R nach der
k-ten Iteration im Algorithmus.
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
Falls P durch den Knoten k + 1 führt, so wurde auf Zeile
15 des Algorithmus
dist[v , w] = dist(v , k + 1) + dist(k + 1, w) gesetz was die
Länge von P ist.
Damit ist die Aussage A(k ) für alle k wahr.
5.72
Outline
Graphen
Pierre Fierz
1 Einleitung
Einleitung
2 Begriffe
3 Der Graph als ADT
4 Implementation von Graphen
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
5 Algorithmen auf Graphen
6 Gewichtete Graphen
7 Flussgraphen
8 Maximaler Fluss
5.73
Begriffe
Graphen
Pierre Fierz
Einleitung
• Ein klassisches Problem bei gewichteten Graphen ist das
Flussproblem
• Bei diesem Problem repräsentiert jede Kante im
gerichteten Graphen eine “Röhre”, die ein gegebenes
Gebrauchsgut transportieren kann.
• Die Gewichte geben dabei die Kapazität der Röhre an,
das heisst, die Menge des Gebrauchsgut, das pro
Zeiteinheit transportiert werden kann.
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
• Das Problem liegt nun darin, die maximale Menge, die von
einem gegebenen Knoten q (Quelle) zu einem anderen
Knoten s (Senke) transportiert werden kann, zu
bestimmen.
5.74
Begriffe 2
Graphen
Pierre Fierz
Beispiel: Computer Netzwerk
Einleitung
• Wir können ein Computernetzwerk als gerichteten
Graphen G darstellen.
• Jeder Knoten repräsentiert einen Computer.
• Eine gerichtete Kante (u, v ) repräsentiert einen
unidirektionalen Kommunikationskanal zwischen dem
Computer u und dem Computer v .
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
• Das Gewicht w der Kante (u, v ) bezeichnet die Bandbreite
des Kanals, das heisst, die maximale anzahl Bytes, die
pro Sekunde von u nach v gesendet werden kann.
• Falls wir nun eine Meldung vom Computer s zum
Computer t senden wollen, so ist die beste Methode die
Meldung in Packete zu zerteilen und diese durch G nach
dem Algorithmus für den maximalen Fluss zu schicken.
5.75
Flussgraphen
Graphen
Pierre Fierz
Einleitung
• Wir wollen nun genau definieren, was wir unter einem
Flussgraphen und den Fluss in einem solchen Graphen
verstehen wollen.
Definition (Flussgraph)
Ein Flussgraph N besteht aus den folgenden Komponenten:
• Ein zusammenhängender gerichteter und geichteter Graph
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
G = (V , E, c) mit nichtnegativen ganzen Gewichten. Das
Gewicht einer Kante e heisst die Kapazität der Kante c(e).
• Zwei verschiedene Knoten q ∈ V und s ∈ V . q heisst die
Quelle und hat keine eingehenden Kanten. s heisst die
Senke und hat keine ausgehenden Kanten.
5.76
Graphen
Flussgraphen 2
Pierre Fierz
Definition (Fluss)
Ein Fluss f in einem Flussgraphen G ist eine Funktion
Einleitung
f : E 7→ N
Begriffe
mit den folgenden zwei Eigenschaften:
Der Graph als ADT
1 Kapazitätsbeschränkung:
Implementation von
Graphen
Algorithmen auf
Graphen
∀e ∈ E : 0 ≤ f (e) ≤ c(e)
Gewichtete Graphen
2 Flusserhaltung:
Flussgraphen
∀v ∈ V \ {q, s} :
X
e∈E − (v )
f (e) =
X
f (e)
Maximaler Fluss
e∈E + (v )
Dabei bedeuten E − (v ) die Menge der eingehenden und E + (v ) die
Menge der ausgehenden Kanten des Knotens v .
Der Wert f (e) heisst Fluss der Kante e.
Mit |f | bezeichnen wir den Wert des Flusses f in einem Flussgraphen N. |f | ist
die Summe der Flüsse, der ausgehenden Kanten der Quelle q.
X
|f | =
f (e)
e∈E + (q)
5.77
Graphen
Flussgraphen 3
Pierre Fierz
Beispiel: Ein Flussgraph mit Fluss |f | = 10
v1
Einleitung
v4
2/2
Begriffe
Der Graph als ADT
3/7
2/5
1/1
q
v3
2/5
4/6
Implementation von
Graphen
s
2/3
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
1/3
5/6
v2
4/8
4/9
Maximaler Fluss
v5
• Die Kapazität der einzelnen Kanten ist immer grösser oder
gleich dem Fluss.
• Für alle Knoten ausser für q und s gilt, dass die Summe
der eingehenden Flüsse gleich der Summe der
ausgehenden Flüsse ist.
5.78
Graphen
Flussgraphen 4
Pierre Fierz
• Die Summe der Flüsse der eingehenden Kanten der
Senke s in einem Flussgraphen N gleich dem Wert des
Flusses des Graphen N
X
|f | =
f (e)
e∈E − (s)
Einleitung
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
• Das heisst, ein Fluss spezifiziert wie ein Gebrauchsgut
von der Quelle q durch den Flussgraphen N in die Senke
s fliesst.
Flussgraphen
Maximaler Fluss
• Wir sind daran interessiert möglichst viel Material pro
Zeiteinheit fliessen zu lassen.
Definition (Maximaler Fluss)
Ein maximaler Fluss für einen Flussgraphen N ist ein Fluss f
mit maximalem Wert über alle möglichen Flüsse von N.
5.79
Graphen
Flussgraphen 5
Pierre Fierz
Beispiel: Ein maximaler Fluss f ∗ (mit Wert |f ∗ | = 14) für den
Flussgraphen N
Einleitung
Begriffe
Der Graph als ADT
v1
Implementation von
Graphen
v4
2/2
Algorithmen auf
Graphen
3/7
1/1
6/6
4/5
Gewichtete Graphen
Flussgraphen
q
v3
5/5
6/6
s
2/3
0/3
v2
Maximaler Fluss
6/8
6/9
v5
5.80
Schnitte im Flussgraphen
Graphen
Pierre Fierz
• Das Konzept des Flusses ist mit dem Konzept des
Schnitts eng verwandt.
• Ein Schnitt ist eine Aufteilung der Knoten eines
Flussgraphen in zwei disjunkte Teilmengen.
• Dabei ist die Quelle q in der einen Menge und die Senke s
in der anderen.
Einleitung
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Definition (Schnitt)
Flussgraphen
Maximaler Fluss
Ein Schnitt eines Flussgraphen N ist eine Partition
X = (Vq , Vs ) der Knoten von N mit q ∈ Vq und s ∈ Vs .
Eine Kante (u, v ) mit u ∈ Vq und v ∈ Vs heisst Vorwärtskante
des Schnittes X .
Eine Kante (u, v ) mit u ∈ Vs und v ∈ Vq heisst Rückwärtskante
des Schnittes X .
5.81
Schnitte im Flussgraphen 2
Graphen
Pierre Fierz
• Wir definieren nun noch die Kapazität und den Fluss durch
einen Schnitt
Definition (Kapazität eines Schnitts)
Einleitung
Begriffe
Der Graph als ADT
Die Kapazität des Schnittes X ist die Summe der Kapazitäten
der Vorwärtskanten von X (die Rückwärtskanten werden nicht
berücksichtigt). Die Kapazität des Schnittes X bezeichnen wir
mit c(X ).
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Unter einem minimalen Schnitt von N versteht man einen
Schnitt mit minimaler Kapazität unter allen Schnitten von N.
Maximaler Fluss
Definition (Fluss durch einen Schnitt X )
Der Fluss durch den Schnitt X , ist gleich der Summe der
Flüsse der Vorwärtskanten von X minus die Summe der
Flüsse der Rückwärtskanten von X . Der Fluss durch den
Schnitt X bezeichnen wir mit f (X ).
5.82
Graphen
Schnitte im Flussgraphen 3
Pierre Fierz
Beispiel: Ein Flussgraph mit drei Schnitte X1 , X2 und X3
Einleitung
v1
v4
2
Begriffe
Der Graph als ADT
7
1
q
X1
v3
5
6
5
6
Implementation von
Graphen
s
3
3
Algorithmen auf
Graphen
Gewichtete Graphen
8
Flussgraphen
v2
9
v5
X3
Maximaler Fluss
X2
• X1 und X2 haben nur Vorwärtskanten.
• X3 hat auch eine Rückwärtskante.
• Die Kapazitäten sind c(X1 ) = 14, c(X2 ) = 18 und
c(X3 ) = 22.
• Der Schnitt X1 ist ein minimaler Schnitt für N
5.83
Graphen
Schnitte im Flussgraphen 4
Pierre Fierz
Theorem (Fluss durch einen Schnitt)
Sei N ein Flussgraph und f ein Fluss von N. Für jeden Schnitt X von N ist der Wert von f
gleich dem Fluss durch X . Das heisst,
Einleitung
|f | = f (X )
Begriffe
Der Graph als ADT
Implementation von
Graphen
Proof.
Algorithmen auf
Graphen
Wir betrachten die folgende Summe

F =
X

X

v ∈Vq
e∈E + (v )
f (e) −
X
f (e)
e∈E − (v )
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
Nach der Flusserhaltungsregel gilt:
P
P
∀v ∈ Vq \ {q} :
e∈E + (v ) f (e) −
e∈E − (v ) f (e) = 0 ⇒
P
F =
e∈E + (q) f (e) ⇒
F = |f |
Auf der anderen Seite gilt für jede Kante e, die weder Vorwärts- noch Rückwärtskante von
X ist, dass F sowohl den Term f (e) wie den Term −f (e) enthält, die einander aufheben.
Für Vorwärtskanten von X is nur der Term f (e) in der Summe F und für Rückwärtskanten
nur der Term −f (e) ⇒
F = f (X )
5.84
Schnitte im Flussgraphen 5
Graphen
Pierre Fierz
Theorem
Sei N ein Flussgraph und X ein Schnitt von N. Für jeden Fluss
f von N gilt, dass der Fluss durch X kleiner oder gleich der
Kapazität von X ist. Das heisst,
f (X ) ≤ c(X )
Einleitung
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Proof.
Flussgraphen
Maximaler Fluss
Wir bezeichnen mit E + (X ) die Vorwärtskanten von X und mit
E − (X ) die Rückwärtskanten von X . Nach der Definition von
f (X ) haben wir:
P
P
f (X ) =
f (e) − e∈E − (X ) f (e)
Pe∈E + (X )
≤
f (e)
Pe∈E + (X )
≤
+
e∈E (X ) c(e) = c(X )
5.85
Schnitte im Flussgraphen 6
Graphen
Pierre Fierz
• Wenn wir die beiden letzten Sätze kombinieren erhalten
wir das wichtige Resultat:
Theorem (Fluss und Schnitte)
Gegeben sei ein Flussgraph N. Für jeden beliebiegen Fluss f
von N und für jeden beliebiegen Schnitt X von N gilt, dass der
Wert von f die Kapazität von X nicht übersteigt. Das heisst
Einleitung
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
|f | ≤ c(X )
• Mit anderen Worten ist die Kapazität eines minimalen
Schnitts von N eine obere Schranke für den Wert von
jedem Fluss f von N.
5.86
Outline
Graphen
Pierre Fierz
1 Einleitung
Einleitung
2 Begriffe
3 Der Graph als ADT
4 Implementation von Graphen
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
5 Algorithmen auf Graphen
6 Gewichtete Graphen
7 Flussgraphen
8 Maximaler Fluss
5.87
Graphen
Maximaler Fluss
Pierre Fierz
• Wir wollen nun sehen, wie der maximale Fluss in einem
Graphen berechnet werden kann.
Einleitung
Definition
Begriffe
Gegeben sei ein Flussgraph N, ein Fluss f von N und eine
gerichtete Kante e = (u, v ). Die Restkapazität der Kante e von
u nach v für den Fluss f ist:
Der Graph als ADT
∆f (u, v ) = c(e) − f (e)
für die Richtung v nach u wird die Restkapazität definiert als
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
∆f (v , u) = f (e)
• Wir betrachten nun Pfade π von q nach s bei dem die
Kanten in beiden Richtungen durchlaufen werden können.
• Eine Kante e = (u, v ) die auf dem Pfad π von q nach s
von u nach v passiert wird heisst Vorwärtskante von π
sonst Rückwärtskante.
5.88
Graphen
Maximaler Fluss 2
Pierre Fierz
Definition (Restkapazität und nutzbare Pfade)
Die Restkapazität eines Pfades π ist die minimale
Restkapazität über die Kanten des Pfades
Einleitung
Begriffe
Der Graph als ADT
Implementation von
Graphen
∆f (π) = min ∆f (e)
e∈π
Dabei ist ∆f (e) = c(e) − f (e) für Vorwärtskanten und
∆f (e) = f (e) für Rückwärtskanten.
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
Ein nutzbarer Pfad für den Fluss f im Flussgraph N ist ein Pfad
π von der Quelle q zur Senke s mit ∆f (π) > 0.
• Für die Kanten e eines nutzbaren Pfades π gilt:
1 f (e) < c(e) falls e eine Vorwärtskante ist
2 f (e) > 0 falls e eine Rückwärtskante ist.
5.89
Graphen
Maximaler Fluss 3
Pierre Fierz
Beispiel: Ein nutzbarer Pfad π mit ∆f (π) = 2 für den Fluss f im
Flussgraphen N
Einleitung
Begriffe
v1
v4
2/4
Der Graph als ADT
Implementation von
Graphen
5/8
3/6
q
2/5
v3
2/3
4/9
Algorithmen auf
Graphen
s
3/3
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
3/7
0/3
v2
3/8
3/3
v5
• Für die Kanten des Pfades haben wir nacheinander die
Restkapazitäten (4, 3, 3, 2, 5)
• Die Restkapazität des Pfades ∆f (π) ist also 2.
5.90
Graphen
Maximaler Fluss 4
Pierre Fierz
Theorem (Fluss und nutzbare Pfade)
Sei π ein nutzbarer Pfad für den Fluss f im Flussgraphen N. Dann existiert ein Fluss f 0
von N mit dem Wert:
0
|f | = |f | + ∆f (π)
Einleitung
Begriffe
Der Graph als ADT
Implementation von
Graphen
Proof.
•
Wir berechnen den neuen Fluss f 0 indem wir den Fluss aller Kanten im Pfad π
folgendermassen verändern.
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
0
f (e) =
f (e) + ∆f (π)
f (e) − ∆f (π)
falls e eine Vorwärtskante ist
falls e eine Rückwärtskante ist.
•
Da ∆f (π) ≥ 0 die minimale Restkapazität über alle Kanten in π ist, wird für eine
Vorwärtskante keine Kapazitätsbeschränkung verletzt, falls wir ∆f (π) zum Fluss
addieren.
•
Aus dem gleichen Grund kann der Fluss auf einer Rückwärtskante nicht kleiner als
0 werden.
•
Also ist f 0 ein gültiger Fluss für N und es gilt:
Maximaler Fluss
0
|f | = |f | + ∆f (π)
da die erste Kante von π eine ausgehende Kante von q ist.
5.91
Graphen
Maximaler Fluss 5
Pierre Fierz
Einleitung
Beispiel: Vergössern des Flusses im Graph
Begriffe
v1
5/8
3/6
q
2/5
v3
2/3
3/7
v4
2/4
v1
5/8
4/9
s
3/3
0/3
3/8
1/6
q
5/7
2/5
v3
2/3
Der Graph als ADT
v4
4/4
Implementation von
Graphen
6/9
s
3/3
2/3
3/8
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
v2
3/3
v5
v2
3/3
v5
Maximaler Fluss
• Die Existenz eines nutzbaren Pfades π für einen Fluss f
impliziert, dass f nicht maximal ist.
• Was ist nun, wenn kein nutzbarer Pfad π für den Fluss f im
Flussgraphen N existiert?
• In diesem Fall ist f maximal
5.92
Graphen
Maximaler Fluss 6
Pierre Fierz
Theorem (Maximaler Fluss)
Falls ein Flussgraph N keinen nutzbaren Pfad für den Fluss f besitzt, dann ist f ein
maximaler Fluss. In diesem Fall existiert ein Schnitt X von N mit |f | = c(X ).
Einleitung
Begriffe
Der Graph als ADT
Proof.
•
•
•
Implementation von
Graphen
Sei f ein Fluss für N und es existiert keinen nutzbaren Pfad für f .
Wir konstruieren einen Schnitt X = (Vq , Vs ) folgendermassen:
Vq sei die Menge der Knoten v , für die ein Pfad von q nach v existiert mit
Restkapazitt > 0
•
In diesem Fall gehört aber s zu Vs , da kein nutzbarer Pfad für f existiert und X ist
ein Schnitt.
•
Nach der Definition von X haben alle Vorwärts- und Rückwärtskanten des
Schnittes X eine Restkapazität von 0. Das heisst
f (e) =
•
•
c(e)
0
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
falls e eine Vorwärtskante von X ist
falls e eine Rückwärtskante von X ist.
Das heisst, f (X ) = c(X ).
Nach dem Theorem über Fluss un Kapazität gilt, dass |f | ≤ c(X ) für alle Schnitte
von N gilt:
|f | = c(X )
5.93
Maximaler Fluss 7
Graphen
Pierre Fierz
Einleitung
Begriffe
Der Graph als ADT
• Als Konsequenz aus dem vorigen Theorem und dem
Theorem über Fluss und Kapazität von Scnitten ergibt sich
der fundamentale Satz
Theorem (Max-Flow, Min-Cut Theorem)
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
Der Wert eines maximalen Flusses ist gleich der Kapazität
eines minimalen Schnittes.
5.94
Der Algorithmus von Ford-Fulkerson
Graphen
Pierre Fierz
• Wir wollen nun den Algorithmus von Ford-Fulkerson
betrachten, der den maximalen Fluss durch einen
Flussgraphen bestimmt.
• Am Anfang haben alle Kanten im Graphen den Fluss 0.
• Solange noch ein nutzbarer Pfad gefunden wird, wird die
Restkapazität dieses Pfades zum Fluss addiert.
• Der Algorithmus terminiert, wenn kein nutzbarer Pfad
mehr gefunden werden kann.
Einleitung
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
• Da die Kapazitäten und der Fluss durch Kanten ganze
Zahlen sind, gilt nach jeder Iteration:
|fnew | ≥ |fold + 1|
• Das heisst, der Algorithmus terminiert im schlechtesten
Fall nach |fmax | Iterationen.
5.95
Der Algorithmus von Ford-Fulkerson 2
Graphen
Pierre Fierz
Einleitung
Begriffe
• Ein nutzbarer Pfad kann mit Hilfe ener modifizierten
Tiefensuche gefunden werden.
Der Graph als ADT
Implementation von
Graphen
• Die Tiefensuche beginnt immer bei der Quelle q.
Algorithmen auf
Graphen
• Statt vom aktuellen Knoten v aus alle inzidenten Kanten
Gewichtete Graphen
zu betrachten, berücksichtigen wir nur die folgenden
Kanten:
Flussgraphen
Maximaler Fluss
• Aus v ausgehende Kanten e, falls f (e) < c(e)
• In v eingehende Kanten e, falls f (e) > 0
• Die Tiefensuche kann in der Zeit O(|E|) realisiert werden
5.96
Graphen
Der Algorithmus von Ford-Fulkerson 3
Pierre Fierz
Beispiel: Ford-Fulkerson
v1
v4
0/4
v1
v4
0/4
Einleitung
0/8
0/6
q
v3
0/3
0/7
0/5
0/9
s
0/3
0/3
v2
v1
q
s
3/3
q
0/8
0/3
0/7
0/6
v3
3/3
v4
0/3
v5
v2
3/3
v5
4/4
v4
v1
4/4
v4
4/6
4/5
v3
3/3
8/9
0/3
3/7
v2
3/8
3/3
8/8
s
3/3
v5
4/6
q
5/5
v3
3/3
9/9
s
3/3
1/3
4/7
v2
Maximaler Fluss
3/8
v1
8/8
Flussgraphen
s
3/3
v2
q
Gewichtete Graphen
4/9
0/3
3/7
Algorithmen auf
Graphen
v5
0/5
Der Graph als ADT
Implementation von
Graphen
0/8
4/4
4/8
Begriffe
s
3/3
0/3
v1
4/9
0/9
0/3
v2
v4
0/5
v3
3/3
0/7
0/5
v3
3/3
v5
4/4
0/6
0/6
q
0/8
0/3
4/8
0/8
3/8
3/3
v5
Minimaler Schnitt
5.97
Der Algorithmus von Ford-Fulkerson 4
Graphen
Pierre Fierz
Ford-Fulkerson in Pseudocode
foreach (e ∈ N)
f (e) := 0
done := false
while (!done) {
Suche einen nutzbaren Pfad π in N für f
if (Pfad π existiert) {
∆ := ∞
foreach (e ∈ π)
if (∆f (e) < ∆)
∆ := ∆f (e)
foreach (e ∈ π)
if (e ist eine Vorwärtskante)
f (e) := f (e) + ∆
else
f (e) := f (e) − ∆
} else
done := true
}
Einleitung
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
5.98
Komplexität von Ford-Fulkerson
Graphen
Pierre Fierz
• Sei n = |V | die Anzahl Knoten und m = |E| die Anzahl
Kanten des Flussgraphen und sei fmax ein maximaler
Fluss.
Einleitung
Begriffe
Der Graph als ADT
• Da der zugrundeliegende Graph zusammenhängend ist
gilt, n ≤ m + 1.
• |fmax | ist eine obere Schranke für die Anzahl mal wo der
Algorithmus einen nutzbaren Pfad sucht.
• Wir können mit der Graphtraversierung einen nutzbaren
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
Pfad in O(m) Zeit finden.
• Für den schlechtesten Fall ist also die Komplexität von
Ford-Fulkerson:
O(|fmax | · m)
• Das nächste Beispiel zeigt, dass der schlechteste Fall
auftreten kann.
5.99
Graphen
Komplexität von Ford-Fulkerson 2
Pierre Fierz
Beispiel: Worst Case für Ford-Fulkerson
v1
0/1,000,000
q
0/1
s
0/1,000,000
0/1,000,000
0/1,000,000
q
1/1,000,000
q
1/1,000,000
s
0/1,000,000
v2
0/1,000,000
Implementation von
Graphen
Algorithmen auf
Graphen
v1
1/1,000,000
1/1
Der Graph als ADT
v2
v1
1/1,000,000
q
Gewichtete Graphen
1/1,000,000
0/1
1/1,000,000
Begriffe
s
1/1
1/1,000,000
v2
0/1,000,000
Einleitung
v1
0/1,000,000
s
Flussgraphen
Maximaler Fluss
1/1,000,000
v2
• Falls die nutzbaren Pfade zwischen (q, v1 , v2 , s) und
(q, v2 , v1 , s) alternieren so braucht es 2,000,000
Iterationen.
• Falls nacheinander die Pfade (q, v1 , s) und (q, v2 , s)
verwendet werden, so braucht es 2 Iterationen
5.100
Komplexität von Ford-Fulkerson 3
Graphen
Pierre Fierz
Einleitung
Begriffe
• Der Algorithmus von Ford-Fulkerson ist ein sogenannter
pseudo polynomialer Algorithmus.
• Die Komplexität ist nicht nur von der Grösse n + m des
Inputs abhängig, sondern auch vom Wert eines
numerischen Parameters |fmax |.
• Wenn die Zahlen binär kodiert sind, so kann |fmax | sehr
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Flussgraphen
Maximaler Fluss
gross werden ohne dass der Input wesentlich vergrössert
wird.
• Falls die nutzbaren Pfade schlecht gewählt werden, so
kann Ford-Fulkerson sehr langsam werden.
5.101
Der Algorithmus von Edmonds-Karp
Graphen
Pierre Fierz
• Der Algorithmus von Edmonds-Karp ist eine Variation von
Ford-Fulkersons Algorithmus.
• Der Unterschied liegt in der Wahl der nutzbaren Pfade.
• Bei jeder Iteration wird ein nutzbarer Pfad mit einer
minimalen Anzahl Kanten gewählt.
• Dies kann mit einer modifizierten Breitensuche in O(m)
Zeit gelöst werden.
Einleitung
Begriffe
Der Graph als ADT
Implementation von
Graphen
Algorithmen auf
Graphen
Gewichtete Graphen
Theorem
Flussgraphen
Anzahl Iterationen Edmond-Karp Wenn der Algorithmus von
Edmonds-Karp auf einem Flussgraph mit n Knoten und m
Kanten ausgeführt wird, so ist die Anzahl Iterationen nicht
grösser als nm.
Maximaler Fluss
• Aus dem Theorem können wir schliessen, dass die Suche
eines maximalen Flusses die Komplexität:
O(nm2 )
5.102
Herunterladen