Kapitel 2: Elementare Graphalgorithmen und Anwendungen Gliederung der Vorlesung 1. Grundbegriffe 2. Elementare Graphalgorithmen und Anwendungen 3. Kürzeste Wege 4. Netzplantechnik 5. Minimal spannende Bäume 6. Traveling Salesman Problem 7. Flüsse in Netzwerken und Anwendungen 8. Bipartite Graphen 2/3, Folie 1 © 2013 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 2: Elementare Graphalgorithmen und Anwendungen Gliederung des Kapitels a) Breitensuche b) Tiefensuche c) Anwendungen der Tiefensuche ... wir konzentrieren uns auf Anwendungen für gerichtete Graphen ... es geht um die folgenden Anwendungen: • • • 2/3, Folie 2 Test auf Kreisfreiheit Bestimmen einer topologischen Sortierung Bestimmen der Zusammenhangskomponenten © 2013 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 2: Elementare Graphalgorithmen und Anwendungen Anwendungen der Tiefensuche ! Begriff: Kreisfreiheit • es sei G = (V,E) ein gerichteter Graph • G ist ein kreisfreier Graph, wenn G keinen Kreis enthält ... nicht kreisfrei 2/3, Folie 3 ... kreisfrei 1 2 6 7 3 4 8 4 © 2013 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 2: Elementare Graphalgorithmen und Anwendungen Anwendungen der Tiefensuche ! Zugehörige algorithmische Fragestellung • gegeben: • • ein gerichteter Graph G = (V,E) gesucht: • eine Antwort auf die Frage, ob G kreisfrei ist ... der Graph G habe genau n Knoten (/* der Einfachheit halber sei V = { 1,...,n } */) und m Kanten 2/3, Folie 4 © 2013 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 2: Elementare Graphalgorithmen und Anwendungen Anwendungen der Tiefensuche ! Algorithmische Idee • • starte eine Tiefensuche im Graphen G bei der Tiefensuche wird überprüft, ob folgendes Ereignis eintritt: • • beim „Erkunden“ einer Kante stellt sich heraus, dass sie zu einem Knoten führt, der bereits „entdeckt“ und noch nicht „vollständig verarbeitet“ ist falls dieses Ereignis wenigstens einmal eintritt, wird „G ist nicht kreisfrei“ ausgegeben; andernfalls, wird „G ist kreisfrei“ ausgegeben ... solche Kanten nennen wir Rückwärtskanten 2/3, Folie 5 © 2013 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 2: Elementare Graphalgorithmen und Anwendungen Anwendungen der Tiefensuche ! Illustration (10/15) (11/14) (0/9) (7/8) 6 7 1 3 8 4 2 5 (12/13) (2/3) (1/6) (4/5) 1 ... der durch die Tiefensuche induzierte Vorgängergraph mit allen Rückwärtskanten 2 4 2/3, Folie 6 © 2013 Prof. Steffen Lange - HDa/FbI - 6 3 5 Graphen und Optimierung 7 8 Kapitel 2: Elementare Graphalgorithmen und Anwendungen Anwendungen der Tiefensuche ! Realisierung • • • • 2/3, Folie 7 setze C[j] = 0 und P[j] = 0 für alle j = 1,...,n setze time = 0 und flag = false for j = 1,...,n do if F[j] == 0 then rufe visit‘(j) auf if flag = true then gib „G ist nicht kreisfrei“ aus else gib „G ist kreisfrei“ aus © 2013 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 2: Elementare Graphalgorithmen und Anwendungen Anwendungen der Tiefensuche ! Realisierung (/* Prozedur visit‘(j) */) • setze C[j] = 1, D[j] = time und time = time + 1 • for all v ∈ A[j] do if C[v] == 1 then setze flag = true if C[v] == 0 then setze P[v] = j und rufe visit‘(v) auf setze C[j] = 2, F[j] = time und time = time + 1 ... offenbar benötigt eine Tiefensuche mit dieser Variante der Prozedur visit(.) auch nur O(n+m) viele Rechenschritte 2/3, Folie 8 © 2013 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 2: Elementare Graphalgorithmen und Anwendungen Anwendungen der Tiefensuche ! Anmerkungen zur Korrektheit (/* der offensichtliche Teil */) ... wenn die Ausgabe „G ist nicht kreisfrei“ erzeugt wird, so gibt es einen Kreis in G • • • man kann sich leicht überlegen, dass zum Zeitpunkt D[v] alle Knoten, die „entdeckt“ und noch nicht „vollständig verarbeitet“ sind, einen Pfad P in G vom Knoten u zum Knoten v bilden (/* gemäß der Reihenfolge der aktiven Aufrufe der Prozedur visit(.) */) • da der Knoten v‘ zu P gehört, gibt es in G auch einen Pfad P‘ vom Knoten v‘ zum Knoten v wenn man P‘ um die Kante (v,v‘) erweitert, erhält man einen Kreis in G • 2/3, Folie 9 es seien (v,v‘) die Kante, die dazu führt, dass „flag = true“ gesetzt wird, und u die Wurzel des Tiefensuchbaums mit den Knoten v und v‘ es sei D[v] der Zeitpunkt, zu dem v „entdeckt“ wird © 2013 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 2: Elementare Graphalgorithmen und Anwendungen Anwendungen der Tiefensuche ! Anmerkungen zur Korrektheit (/* der nicht ganz so offensichtliche Teil */) ... wenn es einen Kreis in G gibt, so wird die Ausgabe „G ist nicht kreisfrei“ erzeugt • es seien P = (v0,v1,...,vk) ein Kreis im Graphen G und vi der Knoten im Pfad P, der zuerst „entdeckt“ wurde • offenbar ist der Pfad P‘ = (vi,vi+1,...,vk,v0,v1,...,vi-1,vi) auch ein Kreis in G und zum Zeitpunkt D[vi] sind alle anderen Knoten in P‘ noch „unentdeckt“ • also gibt es im Tiefensuchbaum mit dem Knoten vi einen Pfad von vi zum Knoten vi-1 (/* siehe Beobachtung 3 im Foliensatz 2.2 */) • nachdem vi-1 „entdeckt“ wurde, wird irgendwann die Kante (vi-1,vi) angefasst da zu diesem Zeitpunkt der Knoten vi immer noch nicht „vollständig verarbeitet“ ist, wird „flag = true“ gesetzt • 2/3, Folie 10 © 2013 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 2: Elementare Graphalgorithmen und Anwendungen Anwendungen der Tiefensuche ! Topologisches Sortieren • es sei G = (V,E) ein gerichteter Graph • das Ziel besteht darin, alle Knoten des Graphen „linear“ anzuordnen, d.h. es soll gelten: • 1 wenn es in G eine Kante (u,v) gibt, so liegt der Knoten u links vom Knoten v in der betrachteten Anordnung der Knoten von G 2 3 2 4 2/3, Folie 11 5 © 2013 Prof. Steffen Lange 3 6 - HDa/FbI - Graphen und Optimierung 6 5 1 4 Kapitel 2: Elementare Graphalgorithmen und Anwendungen Anwendungen der Tiefensuche ! Zugrunde liegende Motivation • es sei G = (V,E) ein gerichteter Graph • im Graphen G wird Wissen über ein Produktionsprozess abgebildet • • jeder Knoten steht für ein Produkt wenn ein Produkt u benötigt wird, um ein Produkt v herzustellen, so gibt es in G eine Kante (u,v) ... eine „lineare“ Anordnung der Knoten in G beschreibt, in welcher Reihenfolge die Produkte produziert werden können 2 2/3, Folie 12 © 2013 Prof. Steffen Lange 3 - HDa/FbI 6 5 - 1 4 Graphen und Optimierung Kapitel 2: Elementare Graphalgorithmen und Anwendungen Anwendungen der Tiefensuche ! Begriff: Topologische Sortierung • • es sei G = (V,E) ein gerichteter Graph mit n Knoten es sei f(.) eine Funktion, die die Menge V auf die Menge { 1,...,n } abbildet • f(.) ist eine topologische Sortierung von G, falls gilt: a) b) 1 zu jedem i = 1,...,n gibt es ein u ∈ V mit f(u) = i für alle Knoten u,v ∈ V gilt: wenn (u,v) ∈ E gilt, so ist f(u) < f(v) 2 3 2 4 5 3 6 5 1 6 ... f(2) = 1, f(3) = 2, f(6) = 3, f(5) = 4,f(1) = 5, f(4) = 6 2/3, Folie 13 © 2013 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung 4 Kapitel 2: Elementare Graphalgorithmen und Anwendungen Anwendungen der Tiefensuche ! Ein grundlegender Zusammenhang • es sei G = (V,E) ein gerichteter Graph Dann sind die folgenden Aussagen äquivalent: 1) 2) G ist kreisfrei. Es gibt eine topologische Sortierung von G. ... klar dürfte sein, dass gilt: „wenn G nicht kreisfrei ist, so gibt es keine topologische Sortierung von G“ ... also gilt: „wenn es eine topologische Sortierung von G gibt, so ist G kreisfrei“ ... es genügt zu zeigen, dass gilt: „wenn G kreisfrei ist, so gibt es eine topologische Sortierung von G“ 2/3, Folie 14 © 2013 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 2: Elementare Graphalgorithmen und Anwendungen Anwendungen der Tiefensuche ! Abgeleitete algorithmische Fragestellung • gegeben: • • ein gerichteter kreisfreier Graph G = (V,E) gesucht: • eine topologische Sortierung von G ... der Graph G habe genau n Knoten (/* der Einfachheit halber sei V = { 1,...,n } */) und m Kanten 2/3, Folie 15 © 2013 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 2: Elementare Graphalgorithmen und Anwendungen Anwendungen der Tiefensuche ! Realisierung • • setze i = n starte eine Tiefensuche für G, bei der sukzessive die Werte F[u] für jeden Knoten u berechnet werden • sobald für einen Knoten u der Wert C[u] = 2 gesetzt wird (/* d.h. u ist „vollständig verarbeitet“ und der Wert F[u] wird festgelegt */), setze f(u) = i und i = i - 1 ... offenbar gilt für alle Knoten u,v der folgende Zusammenhang (/* den wir beim Beweis der Korrektheit ausnutzen */): • „wenn F[u] > F[v] ist, so gilt f(u) < f(v)“ ... es sollte klar sein, dass dieser Algorithmus auch nur O(n+m) viele Rechenschritte benötigt 2/3, Folie 16 © 2013 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 2: Elementare Graphalgorithmen und Anwendungen Anwendungen der Tiefensuche ! Anmerkung zur Korrektheit • es sei (u,v) eine Kante in G • es genügt zu zeigen, dass F[u] > F[v] gilt (/* damit gilt auch - wie gefordert f(u) < f(v) */) • zum Zeitpunkt D[u] kann nur C[v] = 0, C[v] = 1 oder C[v] = 2 gelten • falls C[v] = 1 gilt, kann G nicht kreisfrei sein (/* der Fall ist nicht möglich */) • falls C[v] = 0 gilt, so gilt wie gewünscht F[u] > F[v] (/* siehe Beobachtung 3 im Foliensatz 2.2 */) • falls C[v] = 2 gilt, so muss F[v] < D[u] gelten • 2/3, Folie 17 also muss wegen D[u] < F[u] auch wie gewünscht F[u] > F[v] gelten © 2013 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung