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