• Keine Ergebnisse gefunden

VL-15: Graphalgorithmen II (Datenstrukturen und Algorithmen, SS 2017) Gerhard Woeginger

N/A
N/A
Protected

Academic year: 2022

Aktie "VL-15: Graphalgorithmen II (Datenstrukturen und Algorithmen, SS 2017) Gerhard Woeginger"

Copied!
128
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

VL-15: Graphalgorithmen II

(Datenstrukturen und Algorithmen, SS 2017) Gerhard Woeginger

SS 2017, RWTH

(2)

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 27, 16:15–17:45 Uhr, Aula 1 Keine Vorlesung am 22. Juni!!

(3)

Graphalgorithmen II

• Erreichbarkeitsanalyse

• Zusammenhangskomponenten (ungerichtet)

• Zusammenhangskomponenten (gerichtet)

• Topologisches Sortieren

• Kritische-Pfad Analyse

• Eulersche Kreise

(4)

Wiederholung: Tiefensuche

Tiefensuche (Depth-First Search, DFS)

Am Anfang sind alle Knoten alsunbesucht (WHITE) markiert.

Zugrundeliegende Strategie:

Markiere den aktuellen Knoten v als aktiv(GRAY).

Für jede Kante (v,w)mitunbesuchtemNachfolgerw: Suche rekursiv vonw aus. Das heisst:

Erforsche Kante(v,w), besuche den neu entdeckten Knotenw, und forsche von dort aus, bis es nicht mehr weiter geht.

Dann backtracke vonw nachv.

Für jede Kante (v,w)mit bereitsbesuchtemNachfolgerw: Überprüfe die Kante, ohne aber Nachfolgerw zu besuchen.

Markiere Knotenv als besucht(BLACK).

Zeitkomplexität von DFS istO(|V|+|E|).

(5)

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

E F

G A

B

C

D

F E

G A

B

C

D

E F

(6)

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

F E

G A

B

C

D

E F

G A

B

C

D

F E

G A

B

C

D

E F

(7)

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

E F

G A

B

C

D

F E

G A

B

C

D

F E

G A

B

C

D

F E

(8)

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 }

(9)

Erreichbarkeitsanalyse

(10)

Irrgärten (1)

“Das eben geschieht den Menschen, die in einem Irrgarten hastig werden:

Eben die Eile führt immer tiefer in die Irre.”

[Lucius Annaeus Seneca (4 n.Chr. – 65 n.Chr.)]

(11)

Irrgärten (2a)

Umberto Eco: Der Name der Rose, 1981

Um den Ausgang aus einem Labyrinth zu finden, dozierte William, gibt es nur ein Mittel:

An jedem neuen, das heisst noch niemals zuvor erreichten

Kreuzungspunkt wird der Durchgang, durch den man gekommen ist, mit drei Zeichen markiert.

Erkennt man an den bereits vorhandenen Zeichen auf einem der Durchgänge, dass man an der betreffenden Kreuzung schon einmal gewesen ist, bringt man an dem Durchgang, durch den man gekommen ist, nur ein Zeichen an.

Sind alle Durchgänge schon mit Zeichen versehen, so muss man umkehren und zurückgehen.

Sind aber einer oder zwei Durchgänge der Kreuzung noch nicht mit Zeichen versehen, so wählt man einen davon und bringt zwei Zeichen an. Durchschreitet man einen Durchgang, der nur ein Zeichen trägt, so markiert man ihn mit zwei weiteren, so dass er nun drei Zeichen trägt.

(12)

Irrgärten (2a)

Umberto Eco: Der Name der Rose, 1981

Um den Ausgang aus einem Labyrinth zu finden, dozierte William, gibt es nur ein Mittel:

An jedem neuen, das heisst noch niemals zuvor erreichten

Kreuzungspunkt wird der Durchgang, durch den man gekommen ist, mit drei Zeichen markiert.

Erkennt man an den bereits vorhandenen Zeichen auf einem der Durchgänge, dass man an der betreffenden Kreuzung schon einmal gewesen ist, bringt man an dem Durchgang, durch den man gekommen ist, nur ein Zeichen an.

Sind alle Durchgänge schon mit Zeichen versehen, so muss man umkehren und zurückgehen.

Sind aber einer oder zwei Durchgänge der Kreuzung noch nicht mit Zeichen versehen, so wählt man einen davon und bringt zwei Zeichen an. Durchschreitet man einen Durchgang, der nur ein Zeichen trägt, so markiert man ihn mit zwei weiteren, so dass er nun drei Zeichen trägt.

(13)

Irrgärten (2a)

Umberto Eco: Der Name der Rose, 1981

Um den Ausgang aus einem Labyrinth zu finden, dozierte William, gibt es nur ein Mittel:

An jedem neuen, das heisst noch niemals zuvor erreichten

Kreuzungspunkt wird der Durchgang, durch den man gekommen ist, mit drei Zeichen markiert.

Erkennt man an den bereits vorhandenen Zeichen auf einem der Durchgänge, dass man an der betreffenden Kreuzung schon einmal gewesen ist, bringt man an dem Durchgang, durch den man gekommen ist, nur ein Zeichen an.

Sind alle Durchgänge schon mit Zeichen versehen, so muss man umkehren und zurückgehen.

Sind aber einer oder zwei Durchgänge der Kreuzung noch nicht mit Zeichen versehen, so wählt man einen davon und bringt zwei Zeichen an. Durchschreitet man einen Durchgang, der nur ein Zeichen trägt, so markiert man ihn mit zwei weiteren, so dass er nun drei Zeichen trägt.

(14)

Irrgärten (2a)

Umberto Eco: Der Name der Rose, 1981

Um den Ausgang aus einem Labyrinth zu finden, dozierte William, gibt es nur ein Mittel:

An jedem neuen, das heisst noch niemals zuvor erreichten

Kreuzungspunkt wird der Durchgang, durch den man gekommen ist, mit drei Zeichen markiert.

Erkennt man an den bereits vorhandenen Zeichen auf einem der Durchgänge, dass man an der betreffenden Kreuzung schon einmal gewesen ist, bringt man an dem Durchgang, durch den man gekommen ist, nur ein Zeichen an.

Sind alle Durchgänge schon mit Zeichen versehen, so muss man umkehren und zurückgehen.

Sind aber einer oder zwei Durchgänge der Kreuzung noch nicht mit Zeichen versehen, so wählt man einen davon und bringt zwei Zeichen an. Durchschreitet man einen Durchgang, der nur ein Zeichen trägt, so markiert man ihn mit zwei weiteren, so dass er nun drei Zeichen trägt.

(15)

Irrgärten (2a)

Umberto Eco: Der Name der Rose, 1981

Um den Ausgang aus einem Labyrinth zu finden, dozierte William, gibt es nur ein Mittel:

An jedem neuen, das heisst noch niemals zuvor erreichten

Kreuzungspunkt wird der Durchgang, durch den man gekommen ist, mit drei Zeichen markiert.

Erkennt man an den bereits vorhandenen Zeichen auf einem der Durchgänge, dass man an der betreffenden Kreuzung schon einmal gewesen ist, bringt man an dem Durchgang, durch den man gekommen ist, nur ein Zeichen an.

Sind alle Durchgänge schon mit Zeichen versehen, so muss man umkehren und zurückgehen.

Sind aber einer oder zwei Durchgänge der Kreuzung noch nicht mit Zeichen versehen, so wählt man einen davon und bringt zwei Zeichen an.

Durchschreitet man einen Durchgang, der nur ein Zeichen trägt, so markiert man ihn mit zwei weiteren, so dass er nun drei Zeichen trägt.

(16)

Irrgärten (2a)

Umberto Eco: Der Name der Rose, 1981

Um den Ausgang aus einem Labyrinth zu finden, dozierte William, gibt es nur ein Mittel:

An jedem neuen, das heisst noch niemals zuvor erreichten

Kreuzungspunkt wird der Durchgang, durch den man gekommen ist, mit drei Zeichen markiert.

Erkennt man an den bereits vorhandenen Zeichen auf einem der Durchgänge, dass man an der betreffenden Kreuzung schon einmal gewesen ist, bringt man an dem Durchgang, durch den man gekommen ist, nur ein Zeichen an.

Sind alle Durchgänge schon mit Zeichen versehen, so muss man umkehren und zurückgehen.

Sind aber einer oder zwei Durchgänge der Kreuzung noch nicht mit Zeichen versehen, so wählt man einen davon und bringt zwei Zeichen an.

Durchschreitet man einen Durchgang, der nur ein Zeichen trägt, so markiert man ihn mit zwei weiteren, so dass er nun drei Zeichen trägt.

(17)

Irrgärten (2b)

Alle Teile des Labyrinthes müssten durchlaufen worden sein, wenn man, sobald man an eine Kreuzung gelangt, niemals den Durchgang mit drei Zeichen nimmt, sofern noch einer der anderen Durchgänge frei von Zeichen ist.

Adson: Woher wiss Ihr das? Seid Ihr Experte in Labyrinthen?

William: Nein, ich rezitiere nur einen alten Text, den ich einmal gelesen habe.

Adson: Und nach dieser Regel gelangt man hinaus?

William: Nicht dass ich wüsste. Aber versuchen wir es trotzdem.

(18)

Irrgärten (2b)

Alle Teile des Labyrinthes müssten durchlaufen worden sein, wenn man, sobald man an eine Kreuzung gelangt, niemals den Durchgang mit drei Zeichen nimmt, sofern noch einer der anderen Durchgänge frei von Zeichen ist.

Adson: Woher wiss Ihr das? Seid Ihr Experte in Labyrinthen?

William: Nein, ich rezitiere nur einen alten Text, den ich einmal gelesen habe.

Adson: Und nach dieser Regel gelangt man hinaus?

William: Nicht dass ich wüsste. Aber versuchen wir es trotzdem.

(19)

Irrgärten (2b)

Alle Teile des Labyrinthes müssten durchlaufen worden sein, wenn man, sobald man an eine Kreuzung gelangt, niemals den Durchgang mit drei Zeichen nimmt, sofern noch einer der anderen Durchgänge frei von Zeichen ist.

Adson: Woher wiss Ihr das? Seid Ihr Experte in Labyrinthen?

William: Nein, ich rezitiere nur einen alten Text, den ich einmal gelesen habe.

Adson: Und nach dieser Regel gelangt man hinaus?

William: Nicht dass ich wüsste. Aber versuchen wir es trotzdem.

(20)

Irrgärten (2b)

Alle Teile des Labyrinthes müssten durchlaufen worden sein, wenn man, sobald man an eine Kreuzung gelangt, niemals den Durchgang mit drei Zeichen nimmt, sofern noch einer der anderen Durchgänge frei von Zeichen ist.

Adson: Woher wiss Ihr das? Seid Ihr Experte in Labyrinthen?

William: Nein, ich rezitiere nur einen alten Text, den ich einmal gelesen habe.

Adson: Und nach dieser Regel gelangt man hinaus?

William: Nicht dass ich wüsste. Aber versuchen wir es trotzdem.

(21)

Irrgärten (2b)

Alle Teile des Labyrinthes müssten durchlaufen worden sein, wenn man, sobald man an eine Kreuzung gelangt, niemals den Durchgang mit drei Zeichen nimmt, sofern noch einer der anderen Durchgänge frei von Zeichen ist.

Adson: Woher wiss Ihr das? Seid Ihr Experte in Labyrinthen?

William: Nein, ich rezitiere nur einen alten Text, den ich einmal gelesen habe.

Adson: Und nach dieser Regel gelangt man hinaus?

William: Nicht dass ich wüsste. Aber versuchen wir es trotzdem.

(22)

Irrgärten (3)

Tiefensuchewurde bereits vor Jahrhunderten formal beschrieben als ein Verfahren zum Durchqueren vonLabyrinthen.

Labyrinth als Graph:

Knoten:Stellen, an denen mehr als ein Weg gewählt werden kann Kanten:Wege zwischen Knoten

Eingang:als spezieller Knotenstart Ziel:als spezieller Knotentarget

(23)

Erreichbarkeitsanalyse: DFS Implementierung

1 b o o l DFS ( L i s t adj [ n ] , int start , int & c o l o r [ n ] ,

2 int target, List path) {

3 if (start == target){

4 path.addAtFront(start); return true;

5 }

6 c o l o r [ s t a r t ] = G R A Y ;

7 f o r e a c h ( w in adj [ s t a r t ]) { 8 if ( c o l o r [ w ] == W H I T E ) {

9 if (DFS(adj, w, color, target, path)) { 10 path.addAtFront(start); return true;

11 }

12 }

13 }

14 c o l o r [ s t a r t ] = B L A C K ; 15 return false;

16 } 17

18 b o o l r e a c h ( L i s t adj [ n ] , int n , int start, int target, 19 List &path) { // p a t h ist l e e r 20 int c o l o r [ n ] = W H I T E ;

21 return DFS(adj, start, color, target, path);

22 }

(24)

Zusammenhangskomponenten

(ungerichtet)

(25)

CCs in ungerichteten Graphen

Zusammenhang (in ungerichteten Graphen) Es seiG einungerichteterGraph.

G heisstzusammenhängend, wenn jeder Knoten von jedem anderen Knoten aus erreichbar ist.

EineZusammenhangskomponente(connected component, CC) von G ist ein maximaler zusammenhängender Teilgraph vonG.

Problem

Finde alle Zusammenhangskomponenten fürungerichteten Graphen G .

Lösung

Finde CC von Knotenv: Verwende Tiefen- oder Breitensuche, um alle vonvaus erreichbaren Knoten zu bestimmen. Wiederhole. Die Zeitkomplexität ist O(|V|+|E|).

(26)

CCs in ungerichteten Graphen

Zusammenhang (in ungerichteten Graphen) Es seiG einungerichteterGraph.

G heisstzusammenhängend, wenn jeder Knoten von jedem anderen Knoten aus erreichbar ist.

EineZusammenhangskomponente(connected component, CC) von G ist ein maximaler zusammenhängender Teilgraph vonG.

Problem

Finde alle Zusammenhangskomponenten fürungerichteten Graphen G .

Lösung

Finde CC von Knotenv: Verwende Tiefen- oder Breitensuche, um alle vonvaus erreichbaren Knoten zu bestimmen. Wiederhole. Die Zeitkomplexität ist O(|V|+|E|).

(27)

CCs in ungerichteten Graphen

Zusammenhang (in ungerichteten Graphen) Es seiG einungerichteterGraph.

G heisstzusammenhängend, wenn jeder Knoten von jedem anderen Knoten aus erreichbar ist.

EineZusammenhangskomponente(connected component, CC) von G ist ein maximaler zusammenhängender Teilgraph vonG.

Problem

Finde alle Zusammenhangskomponenten fürungerichteten Graphen G .

Lösung

Finde CC von Knotenv: Verwende Tiefen- oder Breitensuche, um alle vonvaus erreichbaren Knoten zu bestimmen. Wiederhole.

Die Zeitkomplexität ist O(|V|+|E|).

(28)

CCs in ungerichteten Graphen

Zusammenhang (in ungerichteten Graphen) Es seiG einungerichteterGraph.

G heisstzusammenhängend, wenn jeder Knoten von jedem anderen Knoten aus erreichbar ist.

EineZusammenhangskomponente(connected component, CC) von G ist ein maximaler zusammenhängender Teilgraph vonG.

Problem

Finde alle Zusammenhangskomponenten fürungerichteten Graphen G .

Lösung

Finde CC von Knotenv: Verwende Tiefen- oder Breitensuche, um alle vonvaus erreichbaren Knoten zu bestimmen. Wiederhole.

Die Zeitkomplexität ist O(|V|+|E|).

(29)

CCs in ungerichteten Graphen

1 v o i d DFS ( L i s t adj [ n ] , int start , int & c o l o r [ n ] ,

2 int leader, int &cc[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 adj [ s t a r t ]) 5 if ( c o l o r [ n e x t ] == W H I T E )

6 DFS ( adj , next , color , leader, cc) ; 7 c o l o r [ s t a r t ] = B L A C K ;

8 cc[start] = leader; // s p e i c h e r e CC von s t a r t 9 }

10

11 v o i d c o n n C o m p o n e n t s ( L i s t adj [ n ] , int n , int &cc[n]) { 12 int c o l o r [ n ]= W H I T E ;

13 for ( int v = 0; v < n ; v ++)

14 if ( c o l o r [ v ] == W H I T E ) // w e i t e r e K o m p o n e n t e 15 DFS ( adj , v , color , v, cc) ;

16 }

17 // 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

(30)

Zusammenhangskomponenten

(gerichtet)

(31)

SCCs in gerichteten Graphen

Zusammenhang (im gerichteten Graphen) Es seiG eingerichteter Graph.

G heisststark zusammenhängend(strongly connected), wenn jeder Knoten von jedem anderen aus erreichbar ist.

Einestarke ZusammenhangskomponentevonG ist ein maximaler stark zusammenhängender Teilgraph von G.

Starke Zusammenhangskomponenten

(32)

SCCs in gerichteten Graphen

Zusammenhang (im gerichteten Graphen) Es seiG eingerichteter Graph.

G heisststark zusammenhängend(strongly connected), wenn jeder Knoten von jedem anderen aus erreichbar ist.

Einestarke ZusammenhangskomponentevonG ist ein maximaler stark zusammenhängender Teilgraph von G.

Starke Zusammenhangskomponenten

(33)

Kondensationsgraph (1)

Die starken Zusammenhangskomponenten eines gerichteten GraphenG induzieren den dazugehörigenKondensationsgraphen.

Kondensationsgraph

Es seiG = (V,E)ein gerichteter Graph mitk starken ZusammenhangskomponentenSi = (Vi,Ei)für 1≤ik. DerKondensationsgraphG↓= (V0,E0)ist dann definiert durch:

V0={V1, . . . ,Vk}

(Vi,Vj)∈E0 gdw.i6=j und

es gibt(v,w)∈E mitvVi undwVj. Anmerkung: Der KondensationsgraphG↓ istazyklisch.

(34)

Kondensationsgraph (1)

Die starken Zusammenhangskomponenten eines gerichteten GraphenG induzieren den dazugehörigenKondensationsgraphen.

Kondensationsgraph

Es seiG = (V,E)ein gerichteter Graph mitk starken ZusammenhangskomponentenSi = (Vi,Ei)für 1≤ik.

DerKondensationsgraphG↓= (V0,E0)ist dann definiert durch: V0={V1, . . . ,Vk}

(Vi,Vj)∈E0 gdw.i6=j und

es gibt(v,w)∈E mitvVi undwVj. Anmerkung: Der KondensationsgraphG↓ istazyklisch.

(35)

Kondensationsgraph (1)

Die starken Zusammenhangskomponenten eines gerichteten GraphenG induzieren den dazugehörigenKondensationsgraphen.

Kondensationsgraph

Es seiG = (V,E)ein gerichteter Graph mitk starken ZusammenhangskomponentenSi = (Vi,Ei)für 1≤ik.

DerKondensationsgraphG↓= (V0,E0)ist dann definiert durch:

V0={V1, . . . ,Vk}

(Vi,Vj)∈E0 gdw.i6=j und

es gibt(v,w)∈E mitvVi undwVj. Anmerkung: Der KondensationsgraphG↓ istazyklisch.

(36)

Kondensationsgraph (1)

Die starken Zusammenhangskomponenten eines gerichteten GraphenG induzieren den dazugehörigenKondensationsgraphen.

Kondensationsgraph

Es seiG = (V,E)ein gerichteter Graph mitk starken ZusammenhangskomponentenSi = (Vi,Ei)für 1≤ik.

DerKondensationsgraphG↓= (V0,E0)ist dann definiert durch:

V0={V1, . . . ,Vk}

(Vi,Vj)∈E0 gdw.i6=j und

es gibt(v,w)∈E mitvVi undwVj.

Anmerkung: Der KondensationsgraphG↓ istazyklisch.

(37)

Kondensationsgraph (1)

Die starken Zusammenhangskomponenten eines gerichteten GraphenG induzieren den dazugehörigenKondensationsgraphen.

Kondensationsgraph

Es seiG = (V,E)ein gerichteter Graph mitk starken ZusammenhangskomponentenSi = (Vi,Ei)für 1≤ik.

DerKondensationsgraphG↓= (V0,E0)ist dann definiert durch:

V0={V1, . . . ,Vk}

(Vi,Vj)∈E0 gdw.i6=j und

es gibt(v,w)∈E mitvVi undwVj. Anmerkung: Der KondensationsgraphG↓ istazyklisch.

(38)

Kondensationsgraph (2): Beispiel

starke Zusammenhangskomponenten

Ein Digraph und seine Kondensation.

(39)

SCCs und Transponierung

Transponieren

DertransponierteGraph vonG= (V,E)ist gegeben durch GT = (V,E0)mit(v,w)E0 gdw.(w,v)∈E.

InGT ist die Richtung aller Kanten vonG umgedreht.

Lemma (Beziehung zwischenG undGT)

1 Die starken Komponenten vonG undGT sinddie selben.

2 Die Kondensation und die Transpositionkommutieren: (G↓)T = (GT)↓

(40)

SCCs und Transponierung

Transponieren

DertransponierteGraph vonG= (V,E)ist gegeben durch GT = (V,E0)mit(v,w)E0 gdw.(w,v)∈E.

InGT ist die Richtung aller Kanten vonG umgedreht.

Lemma (Beziehung zwischenG undGT)

1 Die starken Komponenten vonG undGT sinddie selben.

2 Die Kondensation und die Transpositionkommutieren: (G↓)T = (GT)↓

(41)

SCCs und Transponierung

Transponieren

DertransponierteGraph vonG= (V,E)ist gegeben durch GT = (V,E0)mit(v,w)E0 gdw.(w,v)∈E.

InGT ist die Richtung aller Kanten vonG umgedreht.

Lemma (Beziehung zwischenG undGT)

1 Die starken Komponenten vonG undGT sinddie selben.

2 Die Kondensation und die Transpositionkommutieren:

(G↓)T = (GT)↓

(42)

Kosaraju-Sharir Algorithmus (1)

DerKosaraju-Sharir Algorithmusfindet SCCs inzweiPhasen:

1 Führe DFS aufG durch. Speichere jeden Knoten beim Abschliessen (d. h. wenn der KnotenBLACKgefärbt wird) auf einem StackS.

2 Färbe alle Knoten wieder aufWHITEzurück.

3 Wiederhole solangeS noch weisse Knoten enthält: Wähle den obersten noch weissen Knotenv vom StackS.

Führe DFS mit Startknotenv auf transponiertem GraphenGT aus. Speichere für jeden besuchten Knoten diesenLeiterknotenv als Repräsentanten seiner SCC.

Definition: Leiter einer SCC

Ein Knotenv heisstLeiter (leader), wenn er alsletzter Knoten in seiner SCC bei der DFSBLACKgefärbt wird.

(43)

Kosaraju-Sharir Algorithmus (1)

DerKosaraju-Sharir Algorithmusfindet SCCs inzweiPhasen:

1 Führe DFS aufG durch. Speichere jeden Knoten beim Abschliessen (d. h. wenn der KnotenBLACKgefärbt wird) auf einem StackS.

2 Färbe alle Knoten wieder aufWHITEzurück.

3 Wiederhole solangeS noch weisse Knoten enthält: Wähle den obersten noch weissen Knotenv vom StackS.

Führe DFS mit Startknotenv auf transponiertem GraphenGT aus. Speichere für jeden besuchten Knoten diesenLeiterknotenv als Repräsentanten seiner SCC.

Definition: Leiter einer SCC

Ein Knotenv heisstLeiter (leader), wenn er alsletzter Knoten in seiner SCC bei der DFSBLACKgefärbt wird.

(44)

Kosaraju-Sharir Algorithmus (1)

DerKosaraju-Sharir Algorithmusfindet SCCs inzweiPhasen:

1 Führe DFS aufG durch. Speichere jeden Knoten beim Abschliessen (d. h. wenn der KnotenBLACKgefärbt wird) auf einem StackS.

2 Färbe alle Knoten wieder aufWHITEzurück.

3 Wiederhole solangeS noch weisse Knoten enthält: Wähle den obersten noch weissen Knotenv vom StackS.

Führe DFS mit Startknotenv auf transponiertem GraphenGT aus. Speichere für jeden besuchten Knoten diesenLeiterknotenv als Repräsentanten seiner SCC.

Definition: Leiter einer SCC

Ein Knotenv heisstLeiter (leader), wenn er alsletzter Knoten in seiner SCC bei der DFSBLACKgefärbt wird.

(45)

Kosaraju-Sharir Algorithmus (1)

DerKosaraju-Sharir Algorithmusfindet SCCs inzweiPhasen:

1 Führe DFS aufG durch. Speichere jeden Knoten beim Abschliessen (d. h. wenn der KnotenBLACKgefärbt wird) auf einem StackS.

2 Färbe alle Knoten wieder aufWHITEzurück.

3 Wiederhole solangeS noch weisse Knoten enthält:

Wähle den obersten noch weissen Knotenv vom StackS.

Führe DFS mit Startknotenv auf transponiertem GraphenGT aus. Speichere für jeden besuchten Knoten diesenLeiterknotenv als Repräsentanten seiner SCC.

Definition: Leiter einer SCC

Ein Knotenv heisstLeiter (leader), wenn er alsletzter Knoten in seiner SCC bei der DFSBLACKgefärbt wird.

(46)

Kosaraju-Sharir Algorithmus (1)

DerKosaraju-Sharir Algorithmusfindet SCCs inzweiPhasen:

1 Führe DFS aufG durch. Speichere jeden Knoten beim Abschliessen (d. h. wenn der KnotenBLACKgefärbt wird) auf einem StackS.

2 Färbe alle Knoten wieder aufWHITEzurück.

3 Wiederhole solangeS noch weisse Knoten enthält:

Wähle den obersten noch weissen Knotenv vom StackS.

Führe DFS mit Startknotenv auf transponiertem GraphenGT aus.

Speichere für jeden besuchten Knoten diesenLeiterknotenv als Repräsentanten seiner SCC.

Definition: Leiter einer SCC

Ein Knotenv heisstLeiter (leader), wenn er alsletzter Knoten in seiner SCC bei der DFSBLACKgefärbt wird.

(47)

Kosaraju-Sharir Algorithmus (1)

DerKosaraju-Sharir Algorithmusfindet SCCs inzweiPhasen:

1 Führe DFS aufG durch. Speichere jeden Knoten beim Abschliessen (d. h. wenn der KnotenBLACKgefärbt wird) auf einem StackS.

2 Färbe alle Knoten wieder aufWHITEzurück.

3 Wiederhole solangeS noch weisse Knoten enthält:

Wähle den obersten noch weissen Knotenv vom StackS.

Führe DFS mit Startknotenv auf transponiertem GraphenGT aus.

Speichere für jeden besuchten Knoten diesenLeiterknotenv als Repräsentanten seiner SCC.

Definition: Leiter einer SCC

Ein Knotenv heisstLeiter (leader), wenn er alsletzter Knoten in seiner SCC bei der DFSBLACKgefärbt wird.

(48)

Kosaraju-Sharir Algorithmus (2)

1 v o i d D F S 1 ( L i s t adj [ n ] , int start , int & c o l o r [ n ] , Stack &S) { 2 c o l o r [ s t a r t ] = G R A Y ;

3 f o r e a c h ( w in adj [ s t a r t ])

4 if ( c o l o r [ w ] == W H I T E ) D F S 1 ( adj , w , color , S ) ; 5 c o l o r [ s t a r t ] = B L A C K ; S.push(start);

6 }

7 v o i d D F S 2 ( L i s t adj [ n ] , int start , int & c o l o r [ n ] , int leader,

8 int &scc[n]) {

9 c o l o r [ s t a r t ] = G R A Y ; 10 f o r e a c h ( w in adj [ s t a r t ])

11 if ( c o l o r [ w ] == W H I T E ) D F S 2 ( adj , w , color , leader , scc ) ; 12 c o l o r [ s t a r t ] = B L A C K ; scc[start] = leader;

13 }

14 v o i d k o s a r a j u - s h a r i r ( L i s t adj [ n ] , int n ) { 15 int c o l o r [ n ] = W H I T E ; S t a c k S ; int scc [ n ];

16 for ( int i = 0; i < n ; i ++) // P h a s e 1

17 if ( c o l o r [ i ] == W H I T E ) D F S 1 ( adj , i , color , S) ; 18 L i s t a d j _ T = adj ^ T ; // T r a n s p o n i e r e

19 for ( int i = 0; i < n ; i ++) c o l o r [ i ] = W H I T E ; // P h a s e 2 20 w h i l e (! S . e m p t y () ) { // P h a s e 3

21 int v = S . pop () ;

22 if ( c o l o r [ v ] == W H I T E ) D F S 2 ( adj_T , v , color , v, scc) ;

23 }

24 }

(49)

Kosaraju-Sharir Algorithmus (3): Beispiel

E G AF DB C

Ursprünglicher Digraph Transponierter Graph

Stack am Ende der Phase 1

In Phase 2 gefundene starke Komponenten B

C

D

G

F E A A

B

C

D G

F E A

B

C

D G

E F

(50)

Kosaraju-Sharir / Korrektheit

Lemma

Es seien C und C0 starke Komponenten mit C6=C0.

Es seien u und v zwei Knoten mit(u,v)E , uC und vC0. Dann schliesst DFS den Leiter von C nachdem Leiter von C0 ab.

Ergo: Phase 2 behandelt KomponenteC vor KomponenteC0 Lemma

Jeder weisse Knoten, der in Phase 2 vom Stapel genommen wird, ist Leiter einer starken Komponente.

Korrektheit

1 Jeder in Phase 2 erzeugte DFS-Baum bildet eine starke Komponente.

2 Alle starken Komponenten vonGT (und deswegen auch alle starken Komponenten vonG) werden in Phase 2 bestimmt.

(51)

Kosaraju-Sharir / Korrektheit

Lemma

Es seien C und C0 starke Komponenten mit C6=C0.

Es seien u und v zwei Knoten mit(u,v)E , uC und vC0. Dann schliesst DFS den Leiter von C nachdem Leiter von C0 ab.

Ergo: Phase 2 behandelt KomponenteC vor KomponenteC0

Lemma

Jeder weisse Knoten, der in Phase 2 vom Stapel genommen wird, ist Leiter einer starken Komponente.

Korrektheit

1 Jeder in Phase 2 erzeugte DFS-Baum bildet eine starke Komponente.

2 Alle starken Komponenten vonGT (und deswegen auch alle starken Komponenten vonG) werden in Phase 2 bestimmt.

(52)

Kosaraju-Sharir / Korrektheit

Lemma

Es seien C und C0 starke Komponenten mit C6=C0.

Es seien u und v zwei Knoten mit(u,v)E , uC und vC0. Dann schliesst DFS den Leiter von C nachdem Leiter von C0 ab.

Ergo: Phase 2 behandelt KomponenteC vor KomponenteC0 Lemma

Jeder weisse Knoten, der in Phase 2 vom Stapel genommen wird, ist Leiter einer starken Komponente.

Korrektheit

1 Jeder in Phase 2 erzeugte DFS-Baum bildet eine starke Komponente.

2 Alle starken Komponenten vonGT (und deswegen auch alle starken Komponenten vonG) werden in Phase 2 bestimmt.

(53)

Kosaraju-Sharir / Korrektheit

Lemma

Es seien C und C0 starke Komponenten mit C6=C0.

Es seien u und v zwei Knoten mit(u,v)E , uC und vC0. Dann schliesst DFS den Leiter von C nachdem Leiter von C0 ab.

Ergo: Phase 2 behandelt KomponenteC vor KomponenteC0 Lemma

Jeder weisse Knoten, der in Phase 2 vom Stapel genommen wird, ist Leiter einer starken Komponente.

Korrektheit

1 Jeder in Phase 2 erzeugte DFS-Baum bildet eine starke Komponente.

2 Alle starken Komponenten vonGT (und deswegen auch alle starken Komponenten vonG) werden in Phase 2 bestimmt.

(54)

Kosaraju-Sharir / Korrektheit

Lemma

Es seien C und C0 starke Komponenten mit C6=C0.

Es seien u und v zwei Knoten mit(u,v)E , uC und vC0. Dann schliesst DFS den Leiter von C nachdem Leiter von C0 ab.

Ergo: Phase 2 behandelt KomponenteC vor KomponenteC0 Lemma

Jeder weisse Knoten, der in Phase 2 vom Stapel genommen wird, ist Leiter einer starken Komponente.

Korrektheit

1 Jeder in Phase 2 erzeugte DFS-Baum bildet eine starke Komponente.

2 Alle starken Komponenten vonGT (und deswegen auch alle starken Komponenten vonG) werden in Phase 2 bestimmt.

(55)

Kosaraju-Sharir / Komplexität

Zeitkomplexität

Die Worst-Case Zeitkomplexität des Kosaraju-Sharir Algorithmus zum Finden starker Komponenten in einem gerichteten Graphen ist Θ(|V|+|E|).

Die Speicherkomplexität istΘ(|V|).

Beweis

DFS über G undGT benötigen jeweilsΘ(|V|+|E|).

Der transponierte GraphGT kann in Θ(|V|+|E|)gebildet werden. Der Stack benötigt Θ(|V|)Speicher.

(56)

Kosaraju-Sharir / Komplexität

Zeitkomplexität

Die Worst-Case Zeitkomplexität des Kosaraju-Sharir Algorithmus zum Finden starker Komponenten in einem gerichteten Graphen ist Θ(|V|+|E|).

Die Speicherkomplexität istΘ(|V|).

Beweis

DFS über G undGT benötigen jeweilsΘ(|V|+|E|).

Der transponierte GraphGT kann in Θ(|V|+|E|)gebildet werden. Der Stack benötigt Θ(|V|)Speicher.

(57)

Kosaraju-Sharir / Komplexität

Zeitkomplexität

Die Worst-Case Zeitkomplexität des Kosaraju-Sharir Algorithmus zum Finden starker Komponenten in einem gerichteten Graphen ist Θ(|V|+|E|).

Die Speicherkomplexität istΘ(|V|).

Beweis

DFS über G undGT benötigen jeweilsΘ(|V|+|E|).

Der transponierte GraphGT kann in Θ(|V|+|E|)gebildet werden. Der Stack benötigt Θ(|V|)Speicher.

(58)

Kosaraju-Sharir / Komplexität

Zeitkomplexität

Die Worst-Case Zeitkomplexität des Kosaraju-Sharir Algorithmus zum Finden starker Komponenten in einem gerichteten Graphen ist Θ(|V|+|E|).

Die Speicherkomplexität istΘ(|V|).

Beweis

DFS über G undGT benötigen jeweilsΘ(|V|+|E|).

Der transponierte GraphGT kann in Θ(|V|+|E|)gebildet werden.

Der Stack benötigt Θ(|V|)Speicher.

(59)

Kosaraju-Sharir / Komplexität

Zeitkomplexität

Die Worst-Case Zeitkomplexität des Kosaraju-Sharir Algorithmus zum Finden starker Komponenten in einem gerichteten Graphen ist Θ(|V|+|E|).

Die Speicherkomplexität istΘ(|V|).

Beweis

DFS über G undGT benötigen jeweilsΘ(|V|+|E|).

Der transponierte GraphGT kann in Θ(|V|+|E|)gebildet werden.

Der Stack benötigt Θ(|V|)Speicher.

(60)

Gerichtete azyklische Graphen (DAGs)

(61)

Gerichtete kreis-freie (azyklische) Graphen

Gerichtete kreis-freie Graphen(directed acyclic graph, DAG) sind eine wichtige Klasse von Graphen:

Viele Probleme lassen sich mit Hilfe von DAGs formulieren. Scheduling: Vorranggraphen (Präzedenzgraphen) beschreiben, welche Aufgaben erledigt sein müssen, bevor ein nachfolgender Schritt beginnen kann. Ein Kreis in solch einem Vorranggraphen wäre ein Deadlock.

Viele Probleme haben auf DAGs eine niedrigere Komplexität als auf Digraphen.

Ein DAG entspricht einerpartiellen Ordnung<auf den Knoten: Eine Kante (v,w)besagt:v<w.

Da eine partielle Ordnung transitiv und anti-symmetrisch ist, kann sie keine Kreise enthalten.

Wir betrachten:Topologische SortierungundKritische-Pfad-Analyse.

(62)

Gerichtete kreis-freie (azyklische) Graphen

Gerichtete kreis-freie Graphen(directed acyclic graph, DAG) sind eine wichtige Klasse von Graphen:

Viele Probleme lassen sich mit Hilfe von DAGs formulieren.

Scheduling: Vorranggraphen (Präzedenzgraphen) beschreiben, welche Aufgaben erledigt sein müssen, bevor ein nachfolgender Schritt beginnen kann. Ein Kreis in solch einem Vorranggraphen wäre ein Deadlock.

Viele Probleme haben auf DAGs eine niedrigere Komplexität als auf Digraphen.

Ein DAG entspricht einerpartiellen Ordnung<auf den Knoten: Eine Kante (v,w)besagt:v<w.

Da eine partielle Ordnung transitiv und anti-symmetrisch ist, kann sie keine Kreise enthalten.

Wir betrachten:Topologische SortierungundKritische-Pfad-Analyse.

(63)

Gerichtete kreis-freie (azyklische) Graphen

Gerichtete kreis-freie Graphen(directed acyclic graph, DAG) sind eine wichtige Klasse von Graphen:

Viele Probleme lassen sich mit Hilfe von DAGs formulieren.

Scheduling: Vorranggraphen (Präzedenzgraphen) beschreiben, welche Aufgaben erledigt sein müssen, bevor ein nachfolgender Schritt beginnen kann. Ein Kreis in solch einem Vorranggraphen wäre ein Deadlock.

Viele Probleme haben auf DAGs eine niedrigere Komplexität als auf Digraphen.

Ein DAG entspricht einerpartiellen Ordnung<auf den Knoten: Eine Kante (v,w)besagt:v<w.

Da eine partielle Ordnung transitiv und anti-symmetrisch ist, kann sie keine Kreise enthalten.

Wir betrachten:Topologische SortierungundKritische-Pfad-Analyse.

(64)

Gerichtete kreis-freie (azyklische) Graphen

Gerichtete kreis-freie Graphen(directed acyclic graph, DAG) sind eine wichtige Klasse von Graphen:

Viele Probleme lassen sich mit Hilfe von DAGs formulieren.

Scheduling: Vorranggraphen (Präzedenzgraphen) beschreiben, welche Aufgaben erledigt sein müssen, bevor ein nachfolgender Schritt beginnen kann. Ein Kreis in solch einem Vorranggraphen wäre ein Deadlock.

Viele Probleme haben auf DAGs eine niedrigere Komplexität als auf Digraphen.

Ein DAG entspricht einerpartiellen Ordnung<auf den Knoten: Eine Kante (v,w)besagt:v<w.

Da eine partielle Ordnung transitiv und anti-symmetrisch ist, kann sie keine Kreise enthalten.

Wir betrachten:Topologische SortierungundKritische-Pfad-Analyse.

(65)

Gerichtete kreis-freie (azyklische) Graphen

Gerichtete kreis-freie Graphen(directed acyclic graph, DAG) sind eine wichtige Klasse von Graphen:

Viele Probleme lassen sich mit Hilfe von DAGs formulieren.

Scheduling: Vorranggraphen (Präzedenzgraphen) beschreiben, welche Aufgaben erledigt sein müssen, bevor ein nachfolgender Schritt beginnen kann. Ein Kreis in solch einem Vorranggraphen wäre ein Deadlock.

Viele Probleme haben auf DAGs eine niedrigere Komplexität als auf Digraphen.

Ein DAG entspricht einerpartiellen Ordnung <auf den Knoten:

Eine Kante (v,w)besagt:v<w.

Da eine partielle Ordnung transitiv und anti-symmetrisch ist, kann sie keine Kreise enthalten.

Wir betrachten:Topologische SortierungundKritische-Pfad-Analyse.

(66)

Gerichtete kreis-freie (azyklische) Graphen

Gerichtete kreis-freie Graphen(directed acyclic graph, DAG) sind eine wichtige Klasse von Graphen:

Viele Probleme lassen sich mit Hilfe von DAGs formulieren.

Scheduling: Vorranggraphen (Präzedenzgraphen) beschreiben, welche Aufgaben erledigt sein müssen, bevor ein nachfolgender Schritt beginnen kann. Ein Kreis in solch einem Vorranggraphen wäre ein Deadlock.

Viele Probleme haben auf DAGs eine niedrigere Komplexität als auf Digraphen.

Ein DAG entspricht einerpartiellen Ordnung <auf den Knoten:

Eine Kante (v,w)besagt:v<w.

Da eine partielle Ordnung transitiv und anti-symmetrisch ist, kann sie keine Kreise enthalten.

Wir betrachten:Topologische SortierungundKritische-Pfad-Analyse.

(67)

Topologisches Sortieren

(68)

Topologisches Sortieren (1a)

A E

G H

F I

B

C

D

A E

G H

F I

B

C

D

Welcher dieser beiden gerichteten Graphen ist azyklisch?

(69)

Topologisches Sortieren (1b)

A E

G H

F I

B

C

D

C B D

A

G H

I E

F

Der rechte enthält einen Zyklus!

Der linke enthält keinen Zyklus.

(70)

Topologisches Sortieren (1b)

A E

G H

F I

B

C

D

C B D

A

G H

I E

F

Der rechte enthält einen Zyklus!

Der linke enthält keinen Zyklus.

(71)

Topologisches Sortieren (2)

Topologische Ordnung

Es seiG = (V,E)ein gerichteter Graph mitnKnoten.

Einetopologische OrdnungvonG ist eine Nummerierung der Knoten topo:V → {1, . . . ,n}, so dass

topo(v)>topo(w)für jede Kante(v,w)∈E gilt.

Eine topologische Ordnung ist die Einbettung einer partiellen Ordnung in eine totale (lineare) Ordnung.

Lemma

1 Für einen Digraphen G mit einem Kreis existiert keinetopologische Ordnung.

2 Jeder DAG hat mindestens eine topologische Ordnung.

(72)

Topologisches Sortieren (2)

Topologische Ordnung

Es seiG = (V,E)ein gerichteter Graph mitnKnoten.

Einetopologische OrdnungvonG ist eine Nummerierung der Knoten topo:V → {1, . . . ,n}, so dass

topo(v)>topo(w)für jede Kante(v,w)∈E gilt.

Eine topologische Ordnung ist die Einbettung einer partiellen Ordnung in eine totale (lineare) Ordnung.

Lemma

1 Für einen Digraphen G mit einem Kreis existiert keinetopologische Ordnung.

2 Jeder DAG hat mindestens eine topologische Ordnung.

(73)

Topologisches Sortieren (2)

Topologische Ordnung

Es seiG = (V,E)ein gerichteter Graph mitnKnoten.

Einetopologische OrdnungvonG ist eine Nummerierung der Knoten topo:V → {1, . . . ,n}, so dass

topo(v)>topo(w)für jede Kante(v,w)∈E gilt.

Eine topologische Ordnung ist die Einbettung einer partiellen Ordnung in eine totale (lineare) Ordnung.

Lemma

1 Für einen Digraphen G mit einem Kreis existiert keinetopologische Ordnung.

2 Jeder DAG hat mindestens eine topologische Ordnung.

(74)

Topologisches Sortieren (2)

Topologische Ordnung

Es seiG = (V,E)ein gerichteter Graph mitnKnoten.

Einetopologische OrdnungvonG ist eine Nummerierung der Knoten topo:V → {1, . . . ,n}, so dass

topo(v)>topo(w)für jede Kante(v,w)∈E gilt.

Eine topologische Ordnung ist die Einbettung einer partiellen Ordnung in eine totale (lineare) Ordnung.

Lemma

1 Für einen Digraphen G mit einem Kreis existiert keinetopologische Ordnung.

2 Jeder DAG hat mindestens eine topologische Ordnung.

(75)

Topologisches Sortieren / Beispiel 1

(76)

Topologisches Sortieren / Beispiel 1

Quelle:http://www- i1.informatik.rwth- aachen.de/~algorithmus/algo8.php

(77)

Topologisches Sortieren / Beispiel 2

A E

G H

F I

B

C

D

Nr Aufgabe Hängt ab von A choose clothes I

B dress A, H

C eat breakfast E, F, G

D leave B, C

E make coffee I

F make toast I

G pour juice I

H shower I

I wake up –

• Gibt es einSchedulefür dieses Problem?

• Gibt es eine Reihenfolge, mit der man alle Aufgaben ausführen kann?

(78)

Topologisches Sortieren / Beispiel 2

A E

G H

F I

B

C

D

Nr Aufgabe Hängt ab von A choose clothes I

B dress A, H

C eat breakfast E, F, G

D leave B, C

E make coffee I

F make toast I

G pour juice I

H shower I

I wake up –

• Gibt es einSchedulefür dieses Problem?

• Gibt es eine Reihenfolge, mit der man alle Aufgaben ausführen kann?

(79)

Topologisches Sortieren: Implementierung

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 &topoNum, int &topo[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 s t [ s t a r t ]) {

5 // if ( c o l o r [ n e x t ] == G R A Y ) t h r o w " G r a p h hat K r e i s ";

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 , topoNum, topo) ;

8 }

9 }

10 topo[start] = ++topoNum;

11 c o l o r [ s t a r t ] = B L A C K ; 12 }

13

14 // A u s g a b e der t o p o l o g i s c h e n Z a h l von K n o t e n v in t o p o [ v ] 15 v o i d t o p o S o r t ( L i s t a d j L s t [ n ] , int n , int & t o p o [ n ]) { 16 int c o l o r [ n ] = WHITE , topoNum = 0;

17 for ( int v = 0; v < n ; v ++) 18 if ( c o l o r [ v ] == W H I T E )

19 d f s S e a r c h ( adjLst , n , v , color , topoNum, topo) ; 20 }

(80)

Topologisches Sortieren / Beispiel 2

2 3 4 5

1 6 7 8 9

A H B E

I F G C D

Abhängigkeitsgraph, der topologischen Ordnung entsprechend gezeichnet

(81)

Korrektheit

Theorem

Der Algorithmus terminiert, und wenn er terminiert enthält das Array

topoeine topologische Ordnung vonG.

Beweis:

1 DFS besucht jeden Knoten. Daher sind die Zahlen im Array topoalle verschieden im Bereich 1 bis n.

2 Sei(v,w)∈E.

Dann istw kein Vorfahre vonv im DFS-Baum (sonstG zyklisch). Daher istw BLACK, wenntopo[v]ein Wert zugewiesen wird. Ergo wurdetopo[w]schon vorher ein Wert zugewiesen. DatopoNumimmer grösser wird, folgttopo[v]>topo[w].

(82)

Korrektheit

Theorem

Der Algorithmus terminiert, und wenn er terminiert enthält das Array

topoeine topologische Ordnung vonG. Beweis:

1 DFS besucht jeden Knoten. Daher sind die Zahlen im Arraytopo alle verschieden im Bereich 1 bis n.

2 Sei(v,w)∈E.

Dann istw kein Vorfahre vonv im DFS-Baum (sonstG zyklisch). Daher istw BLACK, wenntopo[v]ein Wert zugewiesen wird. Ergo wurdetopo[w]schon vorher ein Wert zugewiesen. DatopoNumimmer grösser wird, folgttopo[v]>topo[w].

(83)

Korrektheit

Theorem

Der Algorithmus terminiert, und wenn er terminiert enthält das Array

topoeine topologische Ordnung vonG. Beweis:

1 DFS besucht jeden Knoten. Daher sind die Zahlen im Arraytopo alle verschieden im Bereich 1 bis n.

2 Sei(v,w)∈E.

Dann istw kein Vorfahre vonv im DFS-Baum (sonstG zyklisch). Daher istw BLACK, wenntopo[v]ein Wert zugewiesen wird. Ergo wurdetopo[w]schon vorher ein Wert zugewiesen. DatopoNumimmer grösser wird, folgttopo[v]>topo[w].

(84)

Korrektheit

Theorem

Der Algorithmus terminiert, und wenn er terminiert enthält das Array

topoeine topologische Ordnung vonG. Beweis:

1 DFS besucht jeden Knoten. Daher sind die Zahlen im Arraytopo alle verschieden im Bereich 1 bis n.

2 Sei(v,w)∈E.

Dann istw kein Vorfahre vonv im DFS-Baum (sonstG zyklisch).

Daher istw BLACK, wenntopo[v]ein Wert zugewiesen wird. Ergo wurdetopo[w]schon vorher ein Wert zugewiesen. DatopoNumimmer grösser wird, folgttopo[v]>topo[w].

(85)

Korrektheit

Theorem

Der Algorithmus terminiert, und wenn er terminiert enthält das Array

topoeine topologische Ordnung vonG. Beweis:

1 DFS besucht jeden Knoten. Daher sind die Zahlen im Arraytopo alle verschieden im Bereich 1 bis n.

2 Sei(v,w)∈E.

Dann istw kein Vorfahre vonv im DFS-Baum (sonstG zyklisch).

Daher istw BLACK, wenntopo[v]ein Wert zugewiesen wird.

Ergo wurdetopo[w]schon vorher ein Wert zugewiesen. DatopoNumimmer grösser wird, folgttopo[v]>topo[w].

(86)

Korrektheit

Theorem

Der Algorithmus terminiert, und wenn er terminiert enthält das Array

topoeine topologische Ordnung vonG. Beweis:

1 DFS besucht jeden Knoten. Daher sind die Zahlen im Arraytopo alle verschieden im Bereich 1 bis n.

2 Sei(v,w)∈E.

Dann istw kein Vorfahre vonv im DFS-Baum (sonstG zyklisch).

Daher istw BLACK, wenntopo[v]ein Wert zugewiesen wird.

Ergo wurdetopo[w]schon vorher ein Wert zugewiesen.

DatopoNumimmer grösser wird, folgttopo[v]>topo[w].

(87)

Korrektheit

Theorem

Der Algorithmus terminiert, und wenn er terminiert enthält das Array

topoeine topologische Ordnung vonG. Beweis:

1 DFS besucht jeden Knoten. Daher sind die Zahlen im Arraytopo alle verschieden im Bereich 1 bis n.

2 Sei(v,w)∈E.

Dann istw kein Vorfahre vonv im DFS-Baum (sonstG zyklisch).

Daher istw BLACK, wenntopo[v]ein Wert zugewiesen wird.

Ergo wurdetopo[w]schon vorher ein Wert zugewiesen.

DatopoNumimmer grösser wird, folgttopo[v]>topo[w].

(88)

Komplexität

Zeitkomplexität

Eine topologische Ordnung kann inΘ(|V|+|E|)bestimmt werden.

(89)

Gewichtete Graphen

(90)

Gewichtete Graphen

Knotengewichteter Graph

EinknotengewichteterGraphG ist ein Tripel(V,E,w), wobei:

(V,E)ist ein (gerichteter oder ungerichteter) Graph w :V →Rist dieGewichtsfunktion.

w(v)ist das Gewicht des Knotensv.

Kantengewichteter Graph

EinkantengewichteterGraphG ist ein Tripel(V,E,w), wobei: (V,E)ist ein (gerichteter oder ungerichteter) Graph w :E →Rist die Gewichtsfunktion.

w(e)ist das Gewicht der Kantee.

Ein knotengewichteter Graph(V,E,w)lässt sich in kantengewichteten Graphen(V,E,w0)überführen, indemallevon einem Knotenv

ausgehenden Kantene= (v,·)∈E das Gewichtw0(e) =w(v)erhalten.

(91)

Gewichtete Graphen

Knotengewichteter Graph

EinknotengewichteterGraphG ist ein Tripel(V,E,w), wobei:

(V,E)ist ein (gerichteter oder ungerichteter) Graph w :V →Rist dieGewichtsfunktion.

w(v)ist das Gewicht des Knotensv.

Kantengewichteter Graph

EinkantengewichteterGraphG ist ein Tripel(V,E,w), wobei:

(V,E)ist ein (gerichteter oder ungerichteter) Graph w :E →Rist die Gewichtsfunktion.

w(e)ist das Gewicht der Kantee.

Ein knotengewichteter Graph(V,E,w)lässt sich in kantengewichteten Graphen(V,E,w0)überführen, indemallevon einem Knotenv

ausgehenden Kantene= (v,·)∈E das Gewichtw0(e) =w(v)erhalten.

(92)

Gewichtete Graphen

Knotengewichteter Graph

EinknotengewichteterGraphG ist ein Tripel(V,E,w), wobei:

(V,E)ist ein (gerichteter oder ungerichteter) Graph w :V →Rist dieGewichtsfunktion.

w(v)ist das Gewicht des Knotensv.

Kantengewichteter Graph

EinkantengewichteterGraphG ist ein Tripel(V,E,w), wobei:

(V,E)ist ein (gerichteter oder ungerichteter) Graph w :E →Rist die Gewichtsfunktion.

w(e)ist das Gewicht der Kantee.

Ein knotengewichteter Graph(V,E,w)lässt sich in kantengewichteten Graphen(V,E,w0)überführen, indemallevon einem Knotenv

ausgehenden Kantene= (v,·)∈E das Gewichtw0(e) =w(v)erhalten.

(93)

Gewichtete Graphen: Darstellung (1)

Gewichtete Graphen werden wieder durch Adjazenzliste oder Adjazenzmatrix dargestellt:

Bei knotengewichtetenGraphen wird die Zusatzinformation zu den Knoten üblicherweise in einem weiteren Array gespeichert.

Vergleicheint color[n];bei BFS oder DFS.

Kantengewichte können bei der Adjazenzmatrixdarstellung direkt in der Matrix gespeichert werden.

Ein besonderer Wert, etwa∞besagt, dass keine Kante existiert.

(94)

Gewichtete Graphen: Darstellung (1)

Gewichtete Graphen werden wieder durch Adjazenzliste oder Adjazenzmatrix dargestellt:

Bei knotengewichtetenGraphen wird die Zusatzinformation zu den Knoten üblicherweise in einem weiteren Array gespeichert.

Vergleicheint color[n];bei BFS oder DFS.

Kantengewichte können bei der Adjazenzmatrixdarstellung direkt in der Matrix gespeichert werden.

Ein besonderer Wert, etwa∞besagt, dass keine Kante existiert.

(95)

Gewichtete Graphen: Darstellung (1)

Gewichtete Graphen werden wieder durch Adjazenzliste oder Adjazenzmatrix dargestellt:

Bei knotengewichtetenGraphen wird die Zusatzinformation zu den Knoten üblicherweise in einem weiteren Array gespeichert.

Vergleicheint color[n];bei BFS oder DFS.

Kantengewichte können bei der Adjazenzmatrixdarstellung direkt in der Matrix gespeichert werden.

Ein besonderer Wert, etwa∞besagt, dass keine Kante existiert.

(96)

Gewichtete Graphen: Darstellung (1)

Gewichtete Graphen werden wieder durch Adjazenzliste oder Adjazenzmatrix dargestellt:

Bei knotengewichtetenGraphen wird die Zusatzinformation zu den Knoten üblicherweise in einem weiteren Array gespeichert.

Vergleicheint color[n];bei BFS oder DFS.

Kantengewichte können bei der Adjazenzmatrixdarstellung direkt in der Matrix gespeichert werden.

Ein besonderer Wert, etwa∞besagt, dass keine Kante existiert.

Referenzen

ÄHNLICHE DOKUMENTE

Element getMin(PriorityQueue pq) gibt das Element mit dem kleinsten Schlüssel zurück; benötigt nicht-leere pq. void delMin(PriorityQueue pq) entfernt das Element mit dem

Man kann einen neuen Knoten mit Schlüssel k in den BST t einfügen, ohne die BST-Eigenschaft zu zerstören:.. Suche einen geeigneten,

Daher: Falls Schlüssel auch gelöscht werden sollen, so wird häufiger Verkettung zur Kollisionsauflösung verwendet.... Löschen bei offener

Lambert Kurt John Ivo Harry Greg Frank Edward Dirk Cor Bernhard Adrian. DSAL/SS 2017 VL-18:

Die Ford-Fulkerson Methode erweitert den Fluss in G sukzessive um augmentierende Pfade im Residualen Netzwerk G f bis es keine solche Pfade mehr gibt. Wir werden

DP-Probleme sind im allgemeinen Optimierungsprobleme: Es gibt verschiedene Lösungen, die mit einer Kostenfunktion bewertet werden.. Wir suchen eine Lösung mit minimalen Kosten

Wenn eine Wahl getroffen wurde, kann sie nicht mehr rückgängig gemacht werden.. Greedy Algorithmen finden nicht immer die

Bei Aufgaben vom Typ “Wenden Sie den Algorithmus XYZ auf folgende Eingabe an” werden Punkte ausschliesslich für den Rechenweg vergeben. Für das Auflisten des Endergebnisses alleine