VL-15: Graphalgorithmen II
(Datenstrukturen und Algorithmen, SS 2017) Gerhard Woeginger
SS 2017, RWTH
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!!
Graphalgorithmen II
• Erreichbarkeitsanalyse
• Zusammenhangskomponenten (ungerichtet)
• Zusammenhangskomponenten (gerichtet)
• Topologisches Sortieren
• Kritische-Pfad Analyse
• Eulersche Kreise
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|).
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
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
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
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 }
Erreichbarkeitsanalyse
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.)]
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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
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 }
Zusammenhangskomponenten
(ungerichtet)
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|).
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|).
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|).
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|).
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
Zusammenhangskomponenten
(gerichtet)
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
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
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≤i≤k. DerKondensationsgraphG↓= (V0,E0)ist dann definiert durch:
V0={V1, . . . ,Vk}
(Vi,Vj)∈E0 gdw.i6=j und
es gibt(v,w)∈E mitv ∈Vi undw ∈Vj. Anmerkung: Der KondensationsgraphG↓ istazyklisch.
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≤i≤k.
DerKondensationsgraphG↓= (V0,E0)ist dann definiert durch: V0={V1, . . . ,Vk}
(Vi,Vj)∈E0 gdw.i6=j und
es gibt(v,w)∈E mitv ∈Vi undw ∈Vj. Anmerkung: Der KondensationsgraphG↓ istazyklisch.
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≤i≤k.
DerKondensationsgraphG↓= (V0,E0)ist dann definiert durch:
V0={V1, . . . ,Vk}
(Vi,Vj)∈E0 gdw.i6=j und
es gibt(v,w)∈E mitv ∈Vi undw ∈Vj. Anmerkung: Der KondensationsgraphG↓ istazyklisch.
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≤i≤k.
DerKondensationsgraphG↓= (V0,E0)ist dann definiert durch:
V0={V1, . . . ,Vk}
(Vi,Vj)∈E0 gdw.i6=j und
es gibt(v,w)∈E mitv ∈Vi undw ∈Vj.
Anmerkung: Der KondensationsgraphG↓ istazyklisch.
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≤i≤k.
DerKondensationsgraphG↓= (V0,E0)ist dann definiert durch:
V0={V1, . . . ,Vk}
(Vi,Vj)∈E0 gdw.i6=j und
es gibt(v,w)∈E mitv ∈Vi undw ∈Vj. Anmerkung: Der KondensationsgraphG↓ istazyklisch.
Kondensationsgraph (2): Beispiel
starke Zusammenhangskomponenten
Ein Digraph und seine Kondensation.
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)↓
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)↓
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)↓
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.
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.
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.
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.
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.
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.
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 }
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
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 , u∈C und v ∈C0. 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.
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 , u∈C und v ∈C0. 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.
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 , u∈C und v ∈C0. 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.
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 , u∈C und v ∈C0. 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.
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 , u∈C und v ∈C0. 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.
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.
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.
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.
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.
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.
Gerichtete azyklische Graphen (DAGs)
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.
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.
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.
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.
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.
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.
Topologisches Sortieren
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?
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.
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.
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.
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.
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.
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.
Topologisches Sortieren / Beispiel 1
Topologisches Sortieren / Beispiel 1
Quelle:http://www- i1.informatik.rwth- aachen.de/~algorithmus/algo8.php
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?
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?
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 }
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
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].
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].
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].
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].
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].
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].
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].
Komplexität
Zeitkomplexität
Eine topologische Ordnung kann inΘ(|V|+|E|)bestimmt werden.
Gewichtete Graphen
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.
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.
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.
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.
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.
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.
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.