VL-14: Graphalgorithmen I
(Datenstrukturen und Algorithmen, SS 2017) Gerhard Woeginger
SS 2017, RWTH
DSAL/SS 2017 VL-14: Graphalgorithmen I 1/48
Organisatorisches
• Vorlesung: Gerhard Woeginger (Zimmer 4024 im E1) Sprechstunde: Mittwoch 11:15–12:00
• Übungen: Tim Hartmann, David Korzeniewski, Björn Tauer Email:dsal-i1@algo.rwth-aachen.de
• Webseite:http://algo.rwth-aachen.de/Lehre/SS17/DSA.php
• Nächste Vorlesung:
Dienstag, Juni 20, 16:15–17:45 Uhr, Aula 1
DSAL/SS 2017 VL-14: Graphalgorithmen I 2/48
Graphalgorithmen I
• Terminologie
• Repräsentation von Graphen
• Breitensuche (BFS)
• Tiefensuche (DFS)
• Finden von Zusammenhangskomponenten
Bedeutung der Graphen in der Informatik
Graphen treten in vielen Informatikanwendungen auf:
Beispiele
I (Computer-)Netzwerke
I Darstellung von topologischen Informationen (Karten, . . . )
I Darstellung von elektronischen Schaltungen
I Vorranggraphen (precedence graph), Ablaufpläne, . . .
I Semantische Netze (z. B. Entity-Relationship-Diagramme)
In dieser Vorlesung werden wir uns auf fundamentale Graphalgorithmen konzentrieren.
Was ist ein Graph? (1)
Gerichteter Graph
Eingerichteter Graph(auch: digraph)G ist ein Paar(V,E)mit
I einer endlichen MengeV vonKnoten(vertices) und
I einer MengeE ⊆V ×V von geordnetenPaaren von Knoten, die gerichtete Kanten(arcs) genannt werden.
Ungerichteter Graph
Einungerichteter GraphG ist ein Paar(V,E)mit
I einer endlichen MengeV vonKnoten(vertices) und
I einer MengeE vonungeordneten Knotenpaaren, dieKanten(edges) genannt werden.
DSAL/SS 2017 VL-14: Graphalgorithmen I 5/48
Was ist ein Graph? (2)
Beispiel
I V ={A, . . . ,F}
I E ={(A,B),(A,D),(B,E),(C,E),(C,F),(D,B),(E,D),(F,F)}
Kanten Knoten
A B C
E F D
DSAL/SS 2017 VL-14: Graphalgorithmen I 6/48
Terminologie (1)
I Knotenuistadjazentzu Knotenv, wenn(u,v)∈E
I Knotenuistinzidentzu Kante e= (u,v)
I Kante(u,u)heisstSchlinge(loop)
I DerGraddeg(u)ist die Anzahl der zu uinzidenten Kanten
I In-Graddeg+(u);Aus-Graddeg−(u)
I Graph istk-regulär, falls alle Knoten Gradk haben
Handshake Lemma
In einem ungerichteten GraphenG= (V,E)gilt: X
v∈V
deg(v) =2|E|
Lemma
In gerichtetem Graphen gilt: X
v∈V
deg+(v) = X
v∈V
deg−(v)
Terminologie (2)
Teilgraph
EinTeilgraph(subgraph) eines GraphenG = (V,E)ist ein Graph G0 = (V0,E0)mit:
I V0⊆V undE0⊆E∩(V0×V0).
I Ist V0 ⊂V und/oderE0⊂E, so heisstG0 echter(proper) Teilgraph
I Ist E0=E∩(V0×V0), so ist G0 derdurchV0 induzierte Teilgraph
A B
D E
C
F Teilgraph in rot
Terminologie (3)
Symmetrischer Graph
Der gerichtete GraphG heisstsymmetrisch,
wenn aus(v,w)∈E immer auch(w,v)∈E folgt.
Zu jedem ungerichteten Graphen gibt es einen korrespondierenden symmetrischen Digraphen.
Vollständiger Graph
Ein GraphG heisstvollständig, wenn jedes Paar von Knoten mit einer Kante verbunden ist.
Kn ist der ungerichtete vollständige Graph mitnKnoten.
Transponieren
DertransponierteGraph von G= (V,E)ist gegeben durch GT = (V,E0)mit(v,w)∈E0 gdw.(w,v)∈E.
DSAL/SS 2017 VL-14: Graphalgorithmen I 9/48
Terminologie (4)
Vollständiger (und symmetrischer) Digraph auf vier Knoten:
A B
D E
DSAL/SS 2017 VL-14: Graphalgorithmen I 10/48
Pfade, Kreise, Zusammenhang
Pfade und Kreise (1)
Spaziergang, Pfad
EinSpaziergang(walk) von einem Knotenv zu einem Knotenw ist eine Folgev0,v1,v2, . . . ,vk−1,vk, sodass:
I Startknotenv0=v und Endknotenvk =w
I (vi,vi+1)ist Kante inE, für 0≤i≤k−1
Ein Spaziergang mit lauter paarweise verschiedenen Knoten (das heisst, mitvi 6=vj füri6=j) heisstsimpelodereinfachoderPfad.
Die Länge eines Spaziergangs ist die Anzahl der durchlaufenen Kanten.
Kreis
EinKreis(cycle) ist ein nicht-leerer Pfad bei dem Startknoten mit Endknoten zusammenfällt.
Graph istkreis-frei(azyklisch), wenn er keine Kreise als Teilgraphen hat.
Pfade und Kreise (2)
Schlinge
Kreis
A B C
E F D
A B E D BundC F F sind Beispiele für Spaziergänge.
E D B undC F sind Pfade.
DSAL/SS 2017 VL-14: Graphalgorithmen I 13/48
Zusammenhang (1)
Erreichbarkeit
Ein Knotenw ist vom Knoten v auserreichbar, wenn es einen Pfad vonv nachw gibt.
Zusammenhang (im ungerichteten Graphen)
I G heisstzusammenhängend, wenn jeder Knoten von jedem anderen Knoten aus erreichbar ist.
I EineZusammenhangskomponente(connected component) vonG ist ein maximaler zusammenhängender Teilgraph von G.
DSAL/SS 2017 VL-14: Graphalgorithmen I 14/48
Zusammenhang (2)
Zusammenhang (im gerichteten Graphen)
I G heisststark zusammenhängend (strongly connected), wenn jeder Knoten von jedem anderen aus erreichbar ist.
I G heisstschwach zusammenhängend, wenn der zugrunde liegende ungerichtete Graph (in dem alle Kanten ungerichtet gemacht worden sind) zusammenhängend ist.
I Einestarke ZusammenhangskomponentevonG ist ein maximaler stark zusammenhängender Teilgraph vonG.
I Jeder ungerichtete Graph kanneindeutigin Zusammenhangskomponenten aufgeteilt werden.
I Jeder gerichtete Graph kanneindeutigin starke Zusammenhangskomponenten aufgeteilt werden.
Zusammenhang (3a)
A
D
G B
F
H
J I
E
C
Ein ungerichteter Graph: Wie lauten die Zusammenhangskomponenten?
Zusammenhang (3b)
A
D
G B
F
H
J I
E
C
Die Zusammenhangskomponenten.
DSAL/SS 2017 VL-14: Graphalgorithmen I 17/48
Zusammenhang (4)
Ein nicht-stark-zusammenhängender Digraph, aufgeteilt in seine maximalen stark zusammenhängenden Teilgraphen.
DSAL/SS 2017 VL-14: Graphalgorithmen I 18/48
Zusammenhang (5)
G ist Baum ⇐⇒ G zusammenhängend und G kreis-frei
Anmerkungen
I Ein Baum mitnKnoten hatn−1 Kanten.
I Ein ungerichteter Graph mitnKnoten und n−2 oder weniger Kanten kann nicht zusammenhängend sein.
I Ein ungerichteter Graph mitnKnoten und noder mehr Kanten muss einen Zyklus enthalten.
Repräsentation von Graphen
Repräsentation von Graphen: Adjazenzmatrix
SeiG = (V,E)ein Graph mit
• |V|=n
• |E|=m
• V ={v1, . . . ,vn}
Adjazenzmatrix
In derAdjazenzmatrix-Darstellung ist der Graph durch einen×nMatrix Agegeben, wobei
A(i,j) =1 wenn(vi,vj)∈E A(i,j) =0 wenn(vi,vj)∈/E
I WennG ungerichtet ist, istAsymmetrisch (A=AT).
Dann muss nur die Hälfte der Matrix gespeichert werden.
I Platzbedarf:Θ(n2).
DSAL/SS 2017 VL-14: Graphalgorithmen I 21/48
Repräsentation von Graphen: Adjazenzliste
Adjazenzliste
In der Darstellung alsArray von Adjazenzlistengibt es ein durch die Nummer des Knoten indiziertes Array, das verkettete Listen
(Adjazenzlisten) enthält.
Deri-te Arrayeintrag enthält alle Kanten mit Startknotenvi.
I Ist G ungerichtet, dann wird jede Kante zweimal gespeichert
I Kanten, die in G nicht vorkommen, benötigen keinen Speicherplatz
I Platzbedarf:Θ(n+m).
DSAL/SS 2017 VL-14: Graphalgorithmen I 22/48
Darstellung eines ungerichteten Graphen
Adjazenzliste
D
A B
E
C
B E
A E D C
D B
C E B
D B A
A B C D E
0 1 0 0 1
1 0 1 1 1
0 1 0 1 0
0 1 1 0 1
1 1 0 1 0
Adjazenzmatrix
Darstellung eines gerichteten Graphen
Adjazenzliste
B D
E
F E
B D F A
B C D E F
A B C
E F D
0 1 0 1 0 0
0 0 0 0 1 0
0 0 0 0 1 1
0 1 0 0 0 0
0 0 0 1 0 0
0 0 0 0 0 1
Adjazenzmatrix
Graphendurchlauf
DSAL/SS 2017 VL-14: Graphalgorithmen I 25/48
Graphendurchlauf (1)
Viele Algorithmen (die wir später kennenlernen werden) untersuchen jeden einzelnen Knoten und jede einzelne Kante eines Graphen.
Es gibt verschiedeneGraphendurchlaufstrategien(traversal strategies), die jeden Knoten (oder jede Kante) genau einmal besuchen:
I Breitensuche (BFS)
I Tiefensuche(DFS)
I Es handelt sich um Verallgemeinerungen der Strategien zur Baumtraversierung
I In diesem allgemeineren Szenario müssen wir uns aber alle bereits besuchten Knoten explizit merken
I Im folgenden arbeiten wir mit derAdjazenzlisten-Darstellung
I Algorithmen auf dieser Basis kosten O(|V|+|E|)Zeit
DSAL/SS 2017 VL-14: Graphalgorithmen I 26/48
Graphendurchlauf (2)
Beispiele
I Finden von (schwachen oder starken) Zusammenhangskomponenten
I Topologische Sortierung
I Kritische-Pfad-Analyse
I Finden von 2-Zusammenhangskomponenten (biconnected components)
I und viele weitere . . .
Breitensuche
Breitensuche
Breitensuche (Breadth-First Search, BFS)
Am Anfang sind alle Knoten alsunbesucht(WHITE) markiert.
Die Breitensuche beginnt in einem beliebigen Knotenv. Zugrundeliegende Strategie:
I Markiere den aktuellen Knotenv alsaktiv(GRAY).
I Für jede Kante(v,w)mitunbesuchtemNachfolgerw:
I Suche gleichzeitig von allen derartigen Knotenwaus weiter.
I KeinerleiBacktracking.
I Markiere Knotenv alsbesucht(BLACK).
Anmerkung: Die schwarzen Knoten sind genau jene Knoten, die vom Startknoten auserreichbarsind
DSAL/SS 2017 VL-14: Graphalgorithmen I 29/48
Breitensuche: Beispiel
Beginn der Breitensuche
Fertig!
Erforsche alle folgenden unbesuchten Knoten
Erforsche alle folgenden unbesuchten Knoten G A
B
C
D
E F
G
A
B
D
F E
G
C A
B
C
D
F E
A
B
D
F E
G
C
DSAL/SS 2017 VL-14: Graphalgorithmen I 30/48
Breitensuche: Implementierung
1 v o i d b f s S e a r c h ( L i s t a d j L i s t [ n ] , int n , int s t a r t ) { 2 int c o l o r [ n ];
3 Q u e u e w a i t ; // zu v e r a r b e i t e n d e K n o t e n 4 for ( int i = 0; i < n ; i ++) {
5 c o l o r [ i ] = W H I T E ; // n o c h n i c h t g e f u n d e n
6 }
7 c o l o r [ s t a r t ] = G R A Y ; // s t a r t ist n o c h zu v e r a r b e i t e n 8 w a i t . e n q u e u e ( s t a r t ) ;
9 w h i l e (! w a i t . i s E m p t y () ) {
10 // n a e c h s t e r n o c h u n v e r a r b e i t e t e r K n o t e n 11 int v = w a i t . d e q u e u e () ;
12 f o r e a c h ( w in a d j L i s t [ v ]) { 13 if ( c o l o r [ w ] == W H I T E ) { 14 // n e u e r u n b e s u c h t e r K n o t e n
15 c o l o r [ w ] = G R A Y ; // w ist n o c h zu v e r a r b e i t e n 16 w a i t . e n q u e u e ( w ) ;
17 }
18 }
19 c o l o r [ v ] = B L A C K ; // v ist a b g e s c h l o s s e n
20 }
21 }
Eigenschaften der Breitensuche (1)
Notation
• Für einen Knotenv∈V bezeichnet d(v)den Abstand vom
Startknoten zum Knotenv (das heisst: die Anzahl der Kanten auf dem kürzesten Weg vom Startknoten nachv)
• Wenn ein Knotenw in die Queue gegeben wird, so färben wir die dafür verantwortliche Kante(v,w)gelb. Knotenv ist derVatervon Knotenw.
I BFS besucht die Knoten in einer Reihenfolge mitansteigendem Abstand vom Startknoten
I Erst wenn alle Knoten mit Abstandd verarbeitet worden sind, werden die Knoten mit Abstand d+1 angegangen
I Die Suche terminiert, wenn für einen Abstandd keine Knoten auftreten.
Eigenschaften der Breitensuche (2)
I Die zu verarbeitenden Knoten werden alsFIFO-Queue(first-in first-out) organisiert.
I Es gibteine einzige Verarbeitungsmöglichkeit fürv (nämlich: wenn es aus der Queue entnommen wird)
I Die gelben Kanten induzieren denBreitensuchbaum
I Breitensuchbaum hat Startknoten als Wurzel
Theorem (Komplexität der Breitensuche)
Die Zeitkomplexität von BFS istO(|V|+|E|).
Der Platzbedarf von BFS istΘ(|V|).
DSAL/SS 2017 VL-14: Graphalgorithmen I 33/48
Tiefensuche
DSAL/SS 2017 VL-14: Graphalgorithmen I 34/48
Tiefensuche
Tiefensuche (Depth-First Search, DFS)
Am Anfang sind alle Knoten alsunbesucht(WHITE) markiert.
Zugrundeliegende Strategie:
I Markiere den aktuellen Knotenv alsaktiv(GRAY).
I Für jede Kante(v,w)mitunbesuchtemNachfolgerw:
I Suche rekursiv vonw aus. Das heisst:
I Erforsche Kante(v,w), besuche den neu entdeckten Knotenw, und forsche von dort aus, bis es nicht mehr weiter geht.
I Dann backtracke vonw nachv.
I Für jede Kante(v,w)mit bereitsbesuchtemNachfolgerw:
I Überprüfe die Kante, ohne aber Nachfolgerwzu besuchen.
I Markiere Knotenv alsbesucht(BLACK).
Anmerkung: Auch bei DFS sind die schwarzen Knoten genau jene Knoten, die vom Startknoten auserreichbarsind
Tiefensuche: Beispiel (1)
Beginn der Tiefensuche Erforsche einen Knoten
Erforsche einen Knoten Sackgasse!
Backtracke und erforsche den nächsten Knoten G
A
B
C
D
F E
G A
B
C
D
F E
G A
B
C
D
F E
G A
B
C
D
E F
Tiefensuche: Beispiel (2)
Nächster Zustand wurde bereits gefunden Backtracke und erforsche den nächsten Knoten
B ist eine Sackgasse
Backtracke und erforsche den nächsten Knoten D ist eine Sackgasse
Backtracke und erforsche den nächsten Knoten
Nächster Zustand wurde bereits gefunden Backtracke und erforsche den nächsten Knoten
G A
B
C
D
E F
G A
B
C
D
F E G
A
B
C
D
E F
G A
B
C
D
F E
DSAL/SS 2017 VL-14: Graphalgorithmen I 37/48
Tiefensuche: Beispiel (3)
Erforsche den nächsten Knoten C wurde bereits gefunden
Backtracke und erforsche den nächsten Knoten
Beide nächsten Knoten wurden bereits gefunden Fertig!
G A
B
C
D
F E
G A
B
C
D
F E
G A
B
C
D
F E
G A
B
C
D
F E
DSAL/SS 2017 VL-14: Graphalgorithmen I 38/48
Tiefensuche – Implementierung
1 v o i d d f s R e c ( L i s t a d j L i s t [ n ] , int n ,
2 int start , int & c o l o r [ n ]) {
3 c o l o r [ s t a r t ] = G R A Y ;
4 f o r e a c h ( n e x t in a d j L i s t [ s t a r t ]) { 5 if ( c o l o r [ n e x t ] == W H I T E ) {
6 d f s S R e c ( a dj L is t , n , next , c o l o r ) ;
7 }
8 }
9 c o l o r [ s t a r t ] = B L A C K ; 10 }
11
12 v o i d d f s S e a r c h ( L i s t a d j L i s t [ n ] , int n , int s t a r t ) { 13 int c o l o r [ n ];
14 for ( int i = 0; i < n ; i ++) { // I n i t i a l i s i e r u n g 15 c o l o r [ i ] = W H I T E ;
16 }
17 d f s R e c ( a dj Li s t , n , start , c o l o r ) ; 18 }
Eigenschaften der Tiefensuche (1)
I DFS erforscht einen Pfadso weit wie möglich(dann backtracking)
I Die zu verarbeitenden Knoten werden in LIFO-Reihenfolge abgearbeitet
I Es gibt zweimögliche Verarbeitungszeitpunkte für jeden Knoten:
1. Wenn der Knoten entdeckt wird 2. Wenn der Knoten abgeschlossen wird
Theorem (Komplexität der Breitensuche)
Die Zeitkomplexität von DFS istO(|V|+|E|).
Der Platzbedarf von DFS istΘ(|V|).
Eigenschaften der Tiefensuche (2)
1 v o i d d f s R e c ( L i s t a d j L i s t [ n ] , int n ,
2 int start , int & c o l o r [ n ]) {
3 c o l o r [ s t a r t ] = G R A Y ;
4 time = time+1; left[start] = time;
5 f o r e a c h ( n e x t in a d j L i s t [ s t a r t ]) { 6 if ( c o l o r [ n e x t ] == W H I T E ) {
7 d f s S R e c ( a dj L is t , n , next , c o l o r ) ;
8 }
9 }
10 c o l o r [ s t a r t ] = B L A C K ;
11 time = time+1; right[start] = time;
12 }
• Knotenv ist von Zeitpunktleft[v]bis Zeitpunktright[v]aktiv
DSAL/SS 2017 VL-14: Graphalgorithmen I 41/48
Eigenschaften der Tiefensuche (3)
Fakt
Zwei Intervalle[left[v],right[v]]und[left[u],right[u]]sind entweder disjunkt, oder das eine Intervall enthält das andere
Fakt
Knotenv ist Vorfahre vom Knotenu im DFS-Baum, gdw. left[v]<left[u]<right[u]<right[v]
gdw. zum Zeitpunktleft[v]ein Pfad vonv nachuexistiert, der (bis aufv) nur weisse Knoten enthält
DSAL/SS 2017 VL-14: Graphalgorithmen I 42/48
Eigenschaften der Tiefensuche (4)
DFS-Klassifikation von Kanten
I Baum-Kanten (tree-edges) treten im DFS-Baum auf
I Rückwärts-Kanten (back-edges) gehen von Knotenu zu Vorfahrenv
I Vorwärts-Kanten (forward-edges) gehen von einem Vorfahrenv zum Knotenu
I Quer-Kanten (cross-edges) sind alle restlichen Kanten
Fakt
In einem ungerichteten Graphen ist jede Kante entweder Baum-Kante oder Rückwärts-Kante
Finden von
Zusammenhangskomponenten
Finden von Zusammenhangskomponenten (1)
Problem
Bestimme alle Zusammenhangskomponenten fürungerichteten Graphen.
Lösung
I Konstruiere den zugehörigen symmetrischen Digraphen
I Verwende Tiefensuche:
I Beginne bei einem beliebigen Knoten
I Finde alle anderen Knoten (und alle Kanten) in der selben Komponente mit DFS
I Wenn es weitere Knoten gibt, wähle einen und wiederhole das Verfahren
I Man erhält einenTiefensuchwald.
I Die Zeitkomplexität istΘ(|V|+|E|).
DSAL/SS 2017 VL-14: Graphalgorithmen I 45/48
Finden von Zusammenhangskomponenten (2)
1 // A u s g a b e in cc : cc [ v ] = K o m p o n e n t e von K n o t e n v 2
3 v o i d c o n n C o m p o n e n t s ( L i s t a d j L s t [ n ] , int n , int & cc [ n ]) { 4 int c o l o r [ n ] , c c N u m = 0;
5 for ( int v = 0; v < n ; v ++) { // I n i t i a l i s i e r u n g 6 c o l o r [ v ] = W H I T E ;
7 }
8 for (int v = 0; v < n; v++) {
9 if (color[v] == WHITE) { // w e i t e r e K o m p o n e n t e 10 d f s S e a r c h ( adjLst , n , v , ccNum++, cc) ;
11 }
12 }
13 }
DSAL/SS 2017 VL-14: Graphalgorithmen I 46/48
Finden von Zusammenhangskomponenten (3)
1 v o i d d f s S e a r c h ( L i s t a d j L s t [ n ] , int n , int start , 2 int & c o l o r [ n ] , int ccNum, int &cc[n]) { 3 c o l o r [ s t a r t ] = G R A Y ;
4 cc[start] = ccNum; // s p e i c h e r e N u m m e r der K o m p o n e n t e von v 5 f o r e a c h ( n e x t in a d j L s t [ s t a r t ]) {
6 if ( c o l o r [ n e x t ] == W H I T E ) {
7 d f s S e a r c h ( adjLst , n , next , color , ccNum, cc) ;
8 }
9 }
10 c o l o r [ s t a r t ] = B L A C K ; 11 }
Organisatorisches
• Nächste Vorlesung:
Dienstag, Juni 20, 16:15–17:45 Uhr, Aula 1
• Webseite:http://algo.rwth-aachen.de/Lehre/SS17/DSA.php