• Keine Ergebnisse gefunden

VL-14: Graphalgorithmen I

N/A
N/A
Protected

Academic year: 2022

Aktie "VL-14: Graphalgorithmen I"

Copied!
12
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

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.

(2)

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 MengeEV ×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 V0V undE0E∩(V0×V0).

I Ist V0V und/oderE0E, 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

(3)

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≤ik−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.

(4)

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?

(5)

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

(6)

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

(7)

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

(8)

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 KnotenvV 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.

(9)

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

(10)

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|).

(11)

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

(12)

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

Referenzen

ÄHNLICHE DOKUMENTE

Für einen Knoten eines Graphen ist der Grad definiert als die Anzahl der mit inzidenten Kanten.. Für einen Knoten eines Digraphen definieren wir den Ausgangsgrad

Wenn dieser Eintrag (nennen wir ihn ) in der ersten Zeile aufgezeichnet wird, dann sind alle vorherigen Knoten in der ersten Zeile gelöscht,.

Möglichkeit B: Zwei Bäume sind gleich, wenn man eine eineindeutige (bijektive) Abbildung zwischen den Knoten definieren kann, so dass zwei Urbildknoten genau dann benachbart

Ein schlichter Graph ist genau dann -fach zusammenhängend, wenn für jedes Knotenpaar von , , mindestens paarweise innerlich disjunkte - -Wege existieren.

Bemerkung: Da abgesehen vom Endknoten kein Knoten wiederholt wird, enthält auch ein Hamiltonscher Zyklus jeden Knoten von genau einmal.. Hamiltonsche Graphen sind benannt nach

Das heißt: Wenn jeder Junge Freundinnen hat und jedes Mädchen Freunde, dann kann jeder Junge eine seiner Freundinnen und jedes Mädchen einen ihrer Freunde heiraten.. Beweis

Ist ein Knoten des Graphen ein Endknoten einer Kante im Matching , dann wird als -gesättigt bezeichnet...

Wenn die Nachbarn von weniger als Farben verbrauchen, dann kann mit einer nicht verbrauchten Farbe gefärbt werden... Satz von