Datenstrukturen und Algorithmen Christian Sohler FG Algorithmen & Komplexität 1 Graphalgorithmen Bisherige Ergebnisse: • Dijkstras Algorithmus für positive Kantengewichte; Laufzeit O((|V|+|E|) log |V|) • Bellman-Ford für allgemeine Kantengewichte; Laufzeit O(|V|²+|V|⋅|E|) • Negative Zyklen können erkannt werden Heute: • All Pairs Shortest Paths (mit negativen Kantengewichten) 2 Graphalgorithmen All Pairs Shortest Path (APSP): • Eingabe: Gewichteter Graph G=(V,E) • Ausgabe: Für jedes Paar von Knoten u,v∈V die Distanz von u nach v sowie einen kürzesten Weg a a b c d e f 0 1 5 5 10 9 b ∞ 0 4 5 10 9 c ∞ -3 0 1 6 5 d ∞ -4 0 0 5 4 e ∞ 5 8 9 0 -1 f ∞ ∞ ∞ ∞ ∞ 0 c 4 b 2 7 -4 a 1 6 f 8 -1 5 d 5 e 3 Graphalgorithmen All Pairs Shortest Path (APSP): • Eingabe: Gewichteter Graph G=(V,E) • Ausgabe: Für jedes Paar von Knoten u,v∈V die Distanz von u nach v sowie einen kürzesten Weg a a b c d e f 0 1 5 5 10 9 b ∞ 0 4 5 10 9 c ∞ -3 0 1 6 5 d ∞ -4 0 0 5 4 e ∞ 5 8 9 0 -1 f ∞ ∞ ∞ ∞ ∞ 0 c 4 b 2 7 -4 a 1 6 f 8 -1 5 d 5 e 4 Graphalgorithmen Eingabe APSP: • Matrix W=(wij), die Graph repräsentiert 0 , wenn i=j Gewicht der ger. Kante (i,j), wenn i≠j und (i,j)∈E ∞ , wenn i≠j und (i,j)∉E wij = a b c d e f a 0 2 ∞ 5 ∞ ∞ b ∞ 0 4 ∞ ∞ ∞ c ∞ ∞ 0 1 ∞ 7 d ∞ -4 6 0 5 ∞ e ∞ ∞ 8 ∞ 0 -1 f ∞ ∞ ∞ ∞ ∞ 0 c 4 b 2 7 -4 a 1 6 f 8 -1 5 d 5 e 5 Graphalgorithmen Eingabe APSP: • Matrix W=(wij), die Graph repräsentiert 0 , wenn i=j Gewicht der ger. Kante (i,j), wenn i≠j und (i,j)∈E ∞ , wenn i≠j und (i,j)∉E wij = a b c d e f a 0 2 ∞ 5 ∞ ∞ b ∞ 0 4 ∞ ∞ ∞ c ∞ ∞ 0 1 ∞ 7 d ∞ -4 6 0 5 ∞ e ∞ ∞ 8 ∞ 0 -1 f ∞ ∞ ∞ ∞ ∞ 0 c 4 b 2 7 -4 a 1 6 f 8 -1 5 d 5 e 6 Graphalgorithmen Eingabe APSP: Annahme: Keine negativen Zyklen! • Matrix W=(wij), die Graph repräsentiert 0 , wenn i=j Gewicht der ger. Kante (i,j), wenn i≠j und (i,j)∈E ∞ , wenn i≠j und (i,j)∉E wij = a b c d e f a 0 2 ∞ 5 ∞ ∞ b ∞ 0 4 ∞ ∞ ∞ c ∞ ∞ 0 1 ∞ 7 d ∞ -4 6 0 5 ∞ e ∞ ∞ 8 ∞ 0 -1 f ∞ ∞ ∞ ∞ ∞ 0 c 4 b 2 7 -4 a 1 6 f 8 -1 5 d 5 e 7 Graphalgorithmen Eine neue Rekursion: • Nummeriere Knoten von 1 bis n=|V| • Betrachte kürzeste i-j-Wege, die nur über Knoten 1 bis k laufen 1 2 3 4 5 6 1 0 2 6 5 ∞ 13 2 ∞ 0 4 5 ∞ 11 3 ∞ ∞ 0 1 ∞ 7 4 ∞ -4 0 0 5 7 5 ∞ ∞ 8 14 0 -1 6 ∞ ∞ ∞ ∞ 0 ∞ k=3 3 4 2 2 7 -4 1 1 6 6 8 -1 5 4 5 5 8 Graphalgorithmen Eine neue Rekursion: • Nummeriere Knoten von 1 bis n=|V| • Betrachte kürzeste i-j-Wege, die nur über Knoten 1 bis k laufen 1 2 3 4 5 6 1 0 2 6 5 ∞ 13 2 ∞ 0 4 5 ∞ 11 3 ∞ ∞ 0 1 ∞ 7 4 ∞ -4 0 0 5 7 5 ∞ ∞ 8 14 0 -1 6 ∞ ∞ ∞ ∞ 0 ∞ k=3 3 4 2 2 7 -4 1 1 6 6 8 -1 5 4 5 5 9 Graphalgorithmen Zur Erinnerung: • Sei G ein Graph ohne negative Zyklen und sei j von i aus erreichbar. Dann gibt es einen kürzesten i-j-Weg, der keinen Knoten doppelt benutzt. (Lemma 40) • Wir können also annehmen, dass jeder Knoten in jedem Weg maximal einmal vorkommt • Betrachte i-j-Weg, der nur über Knoten aus {1,…,k} läuft: k j i 10 Graphalgorithmen Zur Erinnerung: • Sei G ein Graph ohne negative Zyklen und sei j von i aus erreichbar. Dann gibt es einen kürzesten i-j-Weg, der keinen Knoten doppelt benutzt. (Lemma 40) • Wir können also annehmen, dass jeder Knoten in jedem Weg maximal einmal vorkommt • Betrachte i-j-Weg, der nur über Knoten aus {1,…,k} läuft: Knoten k tritt maximal einmal auf k j i 11 Graphalgorithmen Zur Erinnerung: • Sei G ein Graph ohne negative Zyklen und sei j von i aus erreichbar. Dann gibt es einen kürzesten i-j-Weg, der keinen Knoten doppelt benutzt. (Lemma 40) • Wir können also annehmen, dass jeder Knoten in jedem Weg maximal einmal vorkommt von u der nach nur k • Betrachte Weg i-j-Weg, über Knoten aus {1,…,k} läuft: führt nur über Knoten aus {1,…,k-1} k j i 12 Graphalgorithmen Zur Erinnerung: • Sei G ein Graph ohne negative Zyklen und sei j von i aus erreichbar. Dann gibt es einen kürzesten i-j-Weg, der keinen Knoten doppelt benutzt. (Lemma 40) • Wir können also annehmen, dass jeder Knoten in jedem Weg maximal einmal vorkommt k nach vaus {1,…,k} läuft: • Betrachte i-j-Weg, der nur Weg übervon Knoten führt nur über Knoten aus {1,…,k-1} k j i 13 Graphalgorithmen Die Rekursion: • Kürzester i-j-Weg über Knoten aus {1,…,k} ist • (a) kürzester i-j-Weg über Knoten aus {1,…,k-1} oder • (b) kürzester i-k-Weg über Knoten aus {1,…,k-1} gefolgt von kürzestem k-j-Weg über Knoten aus {1,…,k-1} Fall (b): k j i 14 Graphalgorithmen Die Rekursion: • Sei d(k) ij die Länge eines kürzesten i-j-Wegs mit über Knoten aus {1,…,k} wij , falls k=0 (k-1) (k-1) (k-1) min ( d ij , dik + dkj ), falls k≥1 (k) d ij = (n) • Matrix D =(d(n) ij ) enthält die gesuchte Lösung 15 Graphalgorithmen Floyd-Warshall(W,n) 1. D (0) ← W 2. for k←1 to n do 3. for i←1 to n do 4. for j←1 to n do (k-1) (k-1) (k-1) (k) 5. d ij ← min(d ij , dik + d kj ) (n) 6. return D 16 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (0) 5 5 1 2 3 4 5 6 1 1 0 2 ∞ 5 ∞ ∞ 1 2 ∞ 0 4 ∞ ∞ ∞ 2 3 ∞ ∞ 0 1 ∞ 7 3 4 -3 4 6 0 5 ∞ 4 5 ∞ ∞ 8 ∞ 0 -1 5 6 ∞ ∞ ∞ ∞ ∞ 0 (1) D 6 2 3 4 5 6 17 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (0) 5 5 1 2 3 4 5 6 1 0 2 ∞ 5 ∞ ∞ 1 2 ∞ 0 4 ∞ ∞ ∞ 2 3 ∞ ∞ 0 1 ∞ 7 3 4 -3 4 6 0 5 ∞ 4 5 ∞ ∞ 8 ∞ 0 -1 5 6 ∞ ∞ ∞ ∞ ∞ 0 (1) D 6 1 2 3 4 5 6 0 2 ∞ 5 ∞ ∞ 18 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (0) 1 2 3 4 5 6 1 0 2 ∞ 5 ∞ ∞ 2 ∞ 0 4 ∞ ∞ 3 ∞ ∞ 0 1 4 -3 4 6 5 ∞ ∞ 6 ∞ ∞ 5 5 1 2 3 4 5 6 1 0 2 ∞ 5 ∞ ∞ ∞ 2 ∞ 0 4 ∞ ∞ ∞ ∞ 7 3 0 5 ∞ 4 8 ∞ 0 -1 5 ∞ ∞ ∞ 0 (1) D 6 19 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (0) 1 2 3 4 5 6 1 0 2 ∞ 5 ∞ ∞ 2 ∞ 0 4 ∞ ∞ 3 ∞ ∞ 0 1 4 -3 4 6 5 ∞ ∞ 6 ∞ ∞ 5 5 1 2 3 4 5 6 1 0 2 ∞ 5 ∞ ∞ ∞ 2 ∞ 0 4 ∞ ∞ ∞ ∞ 7 3 ∞ ∞ 0 1 ∞ 7 0 5 ∞ 4 8 ∞ 0 -1 5 ∞ ∞ ∞ 0 (1) D 6 20 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (0) 1 2 3 4 5 6 1 0 2 ∞ 5 ∞ ∞ 2 ∞ 0 4 ∞ ∞ 3 ∞ ∞ 0 1 4 -3 4 6 5 ∞ ∞ 6 ∞ ∞ 5 5 1 2 3 4 5 6 1 0 2 ∞ 5 ∞ ∞ ∞ 2 ∞ 0 4 ∞ ∞ ∞ ∞ 7 3 ∞ ∞ 0 1 ∞ 7 0 5 ∞ 4 3 -1 6 0 5 ∞ 8 ∞ 0 -1 5 ∞ ∞ ∞ 0 (1) D 6 21 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (0) 1 2 3 4 5 6 1 0 2 ∞ 5 ∞ ∞ 2 ∞ 0 4 ∞ ∞ 3 ∞ ∞ 0 1 4 -3 4 6 5 ∞ ∞ 6 ∞ ∞ 5 5 1 2 3 4 5 6 1 0 2 ∞ 5 ∞ ∞ ∞ 2 ∞ 0 4 ∞ ∞ ∞ ∞ 7 3 ∞ ∞ 0 1 ∞ 7 0 5 ∞ 4 3 -1 6 0 5 ∞ 8 ∞ 0 -1 5 ∞ ∞ 8 ∞ 0 -1 ∞ ∞ ∞ 0 (1) D 6 22 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (0) 1 2 3 4 5 6 1 0 2 ∞ 5 ∞ ∞ 2 ∞ 0 4 ∞ ∞ 3 ∞ ∞ 0 1 4 -3 4 6 5 ∞ ∞ 6 ∞ ∞ 5 5 1 2 3 4 5 6 1 0 2 ∞ 5 ∞ ∞ ∞ 2 ∞ 0 4 ∞ ∞ ∞ ∞ 7 3 ∞ ∞ 0 1 ∞ 7 0 5 ∞ 4 3 -1 6 0 5 ∞ 8 ∞ 0 -1 5 ∞ ∞ 8 ∞ 0 -1 ∞ ∞ ∞ 0 6 ∞ ∞ ∞ ∞ ∞ 0 (1) D 23 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (1) 5 5 1 2 3 4 5 6 1 0 2 ∞ 5 ∞ ∞ 1 2 ∞ 0 4 ∞ ∞ ∞ 2 3 ∞ ∞ 0 1 ∞ 7 3 4 -3 -1 6 0 5 ∞ 4 5 ∞ ∞ 8 ∞ 0 -1 5 6 ∞ ∞ ∞ ∞ ∞ 0 (2) D 6 1 2 3 4 5 6 0 2 6 5 ∞ ∞ 24 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (1) 1 2 3 4 5 6 1 0 2 ∞ 5 ∞ ∞ 2 ∞ 0 4 ∞ ∞ 3 ∞ ∞ 0 1 4 -3 -1 6 5 ∞ ∞ 6 ∞ ∞ 5 5 1 2 3 4 5 6 1 0 2 6 5 ∞ ∞ ∞ 2 ∞ 0 4 ∞ ∞ ∞ ∞ 7 3 0 5 ∞ 4 8 ∞ 0 -1 5 ∞ ∞ ∞ 0 (2) D 6 25 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (1) 1 2 3 4 5 6 1 0 2 ∞ 5 ∞ ∞ 2 ∞ 0 4 ∞ ∞ 3 ∞ ∞ 0 1 4 -3 -1 6 5 ∞ ∞ 6 ∞ ∞ 5 5 1 2 3 4 5 6 1 0 2 6 5 ∞ ∞ ∞ 2 ∞ 0 4 ∞ ∞ ∞ ∞ 7 3 0 5 ∞ 4 8 ∞ 0 -1 5 ∞ ∞ ∞ 0 (2) D 6 26 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (1) 1 2 3 4 5 6 1 0 2 ∞ 5 ∞ ∞ 2 ∞ 0 4 ∞ ∞ 3 ∞ ∞ 0 1 4 -3 -1 6 5 ∞ ∞ 6 ∞ ∞ 5 5 1 2 3 4 5 6 1 0 2 6 5 ∞ ∞ ∞ 2 ∞ 0 4 ∞ ∞ ∞ ∞ 7 3 ∞ ∞ 0 1 ∞ 7 0 5 ∞ 4 8 ∞ 0 -1 5 ∞ ∞ ∞ 0 (2) D 6 27 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (1) 1 2 3 4 5 6 1 0 2 ∞ 5 ∞ ∞ 2 ∞ 0 4 ∞ ∞ 3 ∞ ∞ 0 1 4 -3 -1 6 5 ∞ ∞ 6 ∞ ∞ 5 5 1 2 3 4 5 6 1 0 2 6 5 ∞ ∞ ∞ 2 ∞ 0 4 ∞ ∞ ∞ ∞ 7 3 ∞ ∞ 0 1 ∞ 7 0 5 ∞ 4 -3 -1 3 0 5 ∞ 8 ∞ 0 -1 5 ∞ ∞ ∞ 0 (2) D 6 28 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (1) 1 2 3 4 5 6 1 0 2 ∞ 5 ∞ ∞ 2 ∞ 0 4 ∞ ∞ 3 ∞ ∞ 0 1 4 -3 -1 6 5 ∞ ∞ 6 ∞ ∞ 5 5 1 2 3 4 5 6 1 0 2 6 5 ∞ ∞ ∞ 2 ∞ 0 4 ∞ ∞ ∞ ∞ 7 3 ∞ ∞ 0 1 ∞ 7 0 5 ∞ 4 -3 -1 3 0 5 ∞ 8 ∞ 0 -1 5 ∞ ∞ 8 ∞ 0 -1 ∞ ∞ ∞ 0 (2) D 6 29 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (1) 1 2 3 4 5 6 1 0 2 ∞ 5 ∞ ∞ 2 ∞ 0 4 ∞ ∞ 3 ∞ ∞ 0 1 4 -3 -1 6 5 ∞ ∞ 6 ∞ ∞ 5 5 1 2 3 4 5 6 1 0 2 6 5 ∞ ∞ ∞ 2 ∞ 0 4 ∞ ∞ ∞ ∞ 7 3 ∞ ∞ 0 1 ∞ 7 0 5 ∞ 4 -3 -1 3 0 5 ∞ 8 ∞ 0 -1 5 ∞ ∞ 8 ∞ 0 -1 ∞ ∞ ∞ 0 6 ∞ ∞ ∞ ∞ ∞ 0 (2) D 30 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (2) 5 5 1 2 3 4 5 6 1 0 2 6 5 ∞ ∞ 1 2 ∞ 0 4 ∞ ∞ ∞ 2 3 ∞ ∞ 0 1 ∞ 7 3 4 -3 -1 3 0 5 ∞ 4 5 ∞ ∞ 8 ∞ 0 -1 5 6 ∞ ∞ ∞ ∞ ∞ 0 (3) D 6 1 2 3 4 5 6 0 2 6 5 ∞ 13 31 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (2) 1 2 3 4 5 6 1 0 2 6 5 ∞ ∞ 2 ∞ 0 4 ∞ ∞ 3 ∞ ∞ 0 1 4 -3 -1 3 5 ∞ ∞ 6 ∞ ∞ 5 5 1 2 3 4 5 6 1 0 2 6 5 ∞ 13 ∞ 2 ∞ 0 4 5 ∞ 11 ∞ 7 3 0 5 ∞ 4 8 ∞ 0 -1 5 ∞ ∞ ∞ 0 (3) D 6 32 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (2) 1 2 3 4 5 6 1 0 2 6 5 ∞ ∞ 2 ∞ 0 4 ∞ ∞ 3 ∞ ∞ 0 1 4 -3 -1 3 5 ∞ ∞ 6 ∞ ∞ 5 5 1 2 3 4 5 6 1 0 2 6 5 ∞ 13 ∞ 2 ∞ 0 4 5 ∞ 11 ∞ 7 3 ∞ ∞ 0 1 ∞ 7 0 5 ∞ 4 8 ∞ 0 -1 5 ∞ ∞ ∞ 0 (3) D 6 33 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (2) 1 2 3 4 5 6 1 0 2 6 5 ∞ ∞ 2 ∞ 0 4 ∞ ∞ 3 ∞ ∞ 0 1 4 -3 -1 3 5 ∞ ∞ 6 ∞ ∞ 5 5 1 2 3 4 5 6 1 0 2 6 5 ∞ 13 ∞ 2 ∞ 0 4 5 ∞ 11 ∞ 7 3 ∞ ∞ 0 1 ∞ 7 0 5 ∞ 4 -3 -1 3 0 5 10 8 ∞ 0 -1 5 ∞ ∞ ∞ 0 (3) D 6 34 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (2) 1 2 3 4 5 6 1 0 2 6 5 ∞ ∞ 2 ∞ 0 4 ∞ ∞ 3 ∞ ∞ 0 1 4 -3 -1 3 5 ∞ ∞ 6 ∞ ∞ 5 5 1 2 3 4 5 6 1 0 2 6 5 ∞ 13 ∞ 2 ∞ 0 4 5 ∞ 11 ∞ 7 3 ∞ ∞ 0 1 ∞ 7 0 5 ∞ 4 -3 -1 3 0 5 10 8 ∞ 0 -1 5 ∞ ∞ 8 9 0 -1 ∞ ∞ ∞ 0 (3) D 6 35 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (2) 1 2 3 4 5 6 1 0 2 6 5 ∞ ∞ 2 ∞ 0 4 ∞ ∞ 3 ∞ ∞ 0 1 4 -3 -1 3 5 ∞ ∞ 6 ∞ ∞ 5 5 1 2 3 4 5 6 1 0 2 6 5 ∞ 13 ∞ 2 ∞ 0 4 5 ∞ 11 ∞ 7 3 ∞ ∞ 0 1 ∞ 7 0 5 ∞ 4 -3 -1 3 0 5 10 8 ∞ 0 -1 5 ∞ ∞ 8 9 0 -1 ∞ ∞ ∞ 0 6 ∞ ∞ ∞ ∞ ∞ 0 (3) D 36 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (3) 5 5 1 2 3 4 5 6 1 0 2 6 5 ∞ 13 1 2 ∞ 0 4 5 ∞ 11 2 3 ∞ ∞ 0 1 ∞ 7 3 4 -3 -1 3 0 5 10 4 5 ∞ ∞ 8 9 0 -1 5 6 ∞ ∞ ∞ ∞ ∞ 0 (4) D 6 1 2 3 4 5 6 0 2 6 5 10 13 37 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (3) 1 2 3 4 5 6 1 0 2 6 5 ∞ 13 2 ∞ 0 4 5 ∞ 3 ∞ ∞ 0 1 4 -3 -1 3 5 ∞ ∞ 6 ∞ ∞ 5 5 1 2 3 4 5 1 0 2 6 5 10 13 11 2 2 0 4 5 10 11 ∞ 7 3 0 5 10 4 8 9 0 -1 5 ∞ ∞ ∞ 0 (4) D 6 6 38 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (3) 1 2 3 4 5 6 1 0 2 6 5 ∞ 13 2 ∞ 0 4 5 ∞ 3 ∞ ∞ 0 1 4 -3 -1 3 5 ∞ ∞ 6 ∞ ∞ 5 5 1 2 3 4 5 1 0 2 6 5 10 13 11 2 2 0 4 5 10 11 ∞ 7 3 -2 0 0 1 6 0 5 10 4 8 9 0 -1 5 ∞ ∞ ∞ 0 (4) D 6 6 7 39 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (3) 1 2 3 4 5 6 1 0 2 6 5 ∞ 13 2 ∞ 0 4 5 ∞ 3 ∞ ∞ 0 1 4 -3 -1 3 5 ∞ ∞ 6 ∞ ∞ 5 5 1 2 3 4 5 1 0 2 6 5 10 13 11 2 2 0 4 5 10 11 ∞ 7 3 -2 0 0 1 6 7 0 5 10 4 -3 -1 3 0 5 10 8 9 0 -1 5 ∞ ∞ ∞ 0 (4) D 6 6 40 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (3) 1 2 3 4 5 6 1 0 2 6 5 ∞ 13 2 ∞ 0 4 5 ∞ 3 ∞ ∞ 0 1 4 -3 -1 3 5 ∞ ∞ 6 ∞ ∞ 5 5 1 2 3 4 5 1 0 2 6 5 10 13 11 2 2 0 4 5 10 11 ∞ 7 3 -2 0 0 1 6 7 0 5 10 4 -3 -1 3 0 5 10 8 9 0 -1 5 6 8 8 9 0 -1 ∞ ∞ ∞ 0 (4) D 6 6 41 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (3) 1 2 3 4 5 6 1 0 2 6 5 ∞ 13 2 ∞ 0 4 5 ∞ 3 ∞ ∞ 0 1 4 -3 -1 3 5 ∞ ∞ 6 ∞ ∞ 5 5 1 2 3 4 5 1 0 2 6 5 10 13 11 2 2 0 4 5 10 11 ∞ 7 3 -2 0 0 1 6 7 0 5 10 4 -3 -1 3 0 5 10 8 9 0 -1 5 6 8 8 9 0 -1 ∞ ∞ ∞ 0 6 ∞ ∞ ∞ ∞ ∞ 0 (4) D 6 42 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (4) 5 5 1 2 3 4 5 6 1 0 2 6 5 10 13 1 2 2 0 4 5 10 11 2 3 -2 0 0 1 6 7 3 4 -3 -1 3 0 5 10 4 5 6 8 8 9 0 -1 5 6 ∞ ∞ ∞ ∞ ∞ 0 (5) D 6 1 2 3 4 5 6 0 2 6 5 10 9 43 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (4) 1 2 3 4 5 1 0 2 6 5 10 13 2 2 0 4 5 3 -2 0 0 4 -3 -1 5 6 6 ∞ 5 5 6 1 2 3 4 5 1 0 2 6 5 10 9 10 11 2 2 0 4 5 10 9 1 6 7 3 3 0 5 10 4 8 8 9 0 -1 5 ∞ ∞ ∞ ∞ 0 (5) D 6 6 44 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (4) 1 2 3 4 5 1 0 2 6 5 10 13 2 2 0 4 5 3 -2 0 0 4 -3 -1 5 6 6 ∞ 5 5 6 1 2 3 4 5 1 0 2 6 5 10 9 10 11 2 2 0 4 5 10 9 1 6 7 3 -2 0 0 1 6 3 0 5 10 4 8 8 9 0 -1 5 ∞ ∞ ∞ ∞ 0 (5) D 6 6 5 45 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (4) 1 2 3 4 5 1 0 2 6 5 10 13 2 2 0 4 5 3 -2 0 0 4 -3 -1 5 6 6 ∞ 5 5 6 1 2 3 4 5 1 0 2 6 5 10 9 10 11 2 2 0 4 5 10 9 1 6 7 3 -2 0 0 1 6 5 3 0 5 10 4 -3 -1 3 0 5 4 8 8 9 0 -1 5 ∞ ∞ ∞ ∞ 0 (5) D 6 6 46 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (4) 1 2 3 4 5 1 0 2 6 5 10 13 2 2 0 4 5 3 -2 0 0 4 -3 -1 5 6 6 ∞ 5 5 6 1 2 3 4 5 1 0 2 6 5 10 9 10 11 2 2 0 4 5 10 9 1 6 7 3 -2 0 0 1 6 5 3 0 5 10 4 -3 -1 3 0 5 4 8 8 9 0 -1 5 6 8 8 9 0 -1 ∞ ∞ ∞ ∞ 0 (5) D 6 6 47 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (4) 1 2 3 4 5 1 0 2 6 5 10 13 2 2 0 4 5 3 -2 0 0 4 -3 -1 5 6 6 ∞ 5 5 6 1 2 3 4 5 1 0 2 6 5 10 9 10 11 2 2 0 4 5 10 9 1 6 7 3 -2 0 0 1 6 5 3 0 5 10 4 -3 -1 3 0 5 4 8 8 9 0 -1 5 6 8 8 9 0 -1 ∞ ∞ ∞ ∞ 0 6 ∞ ∞ ∞ ∞ ∞ 0 (5) D 6 48 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (5) 1 2 3 4 5 1 0 2 6 5 10 9 2 2 0 4 5 3 -2 0 0 4 -3 -1 5 6 6 ∞ 5 5 6 1 2 3 4 5 1 0 2 6 5 10 9 10 9 2 2 0 4 5 10 9 1 6 5 3 -2 0 0 1 6 5 3 0 5 4 4 -3 -1 3 0 5 4 8 8 9 0 -1 5 6 8 8 9 0 -1 ∞ ∞ ∞ ∞ 0 6 ∞ ∞ ∞ ∞ ∞ 0 (6) D 6 49 Graphalgorithmen 3 4 2 2 7 4 1 1 -3 6 8 6 -1 5 4 D (5) 1 2 3 4 5 1 0 2 6 5 10 9 2 2 0 4 5 3 -2 0 0 4 -3 -1 5 6 6 ∞ 5 5 6 1 2 3 4 5 1 0 2 6 5 10 9 10 9 2 2 0 4 5 10 9 1 6 5 3 -2 0 0 1 6 5 3 0 5 4 4 -3 -1 3 0 5 4 8 8 9 0 -1 5 6 8 8 9 0 -1 ∞ ∞ ∞ ∞ 0 6 ∞ ∞ ∞ ∞ ∞ 0 (6) D 6 50 Graphalgorithmen Satz 44: Sei G=(V,E) ein Graph mit nicht-negativen Zyklen. Dann berechnet der Algorithmus von Floyd-Warshall die Entfernung zwischen jedem Knotenpaar in O(|V|³) Zeit. 51 Graphalgorithmen Aufrechterhalten der kürzesten Wege: • Konstruiere Vorgängermatrix Π (n) (n) • Dazu konstruiere Sequenz Π(1),…, Π mit Π = Π (k) • Π(k) ist Vorgängermatrix zu D • π ij(k) ist Vorgänger von Knoten j auf dem kürzesten Weg von Knoten i über Knoten aus {1,…,k} • Die Startmatrix: (0) πij = nil , falls i=j oder wij =∞ i , falls i≠j und wij <∞ 52 Graphalgorithmen Aufrechterhalten der kürzesten Wege: • Konstruiere Vorgängermatrix Π (n) (n) • Dazu konstruiere Sequenz Π(1),…, Π mit Π = Π (k) • Π(k) ist Vorgängermatrix zu D • π ij(k) ist Vorgänger von Knoten j auf dem kürzesten Weg von Knoten i über Knoten aus {1,…,k} • Das Aktualisieren: (k-1) (k) πij = πij(k-1) , falls d ij π(k-1) kj , falls (k-1) dij (k-1) ≤ d ik > (k-1) dik (k-1) + dkj + (k-1) dkj 53 Graphalgorithmen SSSP (pos. Kantengewichte): • Dijkstra; Laufzeit O((|V|+|E|) log |V|) SSSP (allgemeine Kantengewichte): • Bellman-Ford; Laufzeit O(|V|²+|V| |E|) APSP (allgemeine Kantengewichte, keine negativen Zyklen) • Floyd-Warshall; Laufzeit O(|V|³) 54 Graphalgorithmen Das transitive Hülle Problem: • Gegeben sei ein gerichteter, ungewichteter Graph G=(V,E) • Gesucht: Die transitive Hülle G*=(V,E*) von G, wobei E*={(u,v): es gibt Weg von u nach v in G} G G* 55 Graphalgorithmen Transitive Hülle: • in O(|V|³) Zeit mit Floyd-Warshall • In O(|V|²+|V| |E|) Zeit mit Breiten- oder Tiefensuche von jedem Knoten • Geht das auch schneller? 56 Graphalgorithmen Graphen und Matrixmultiplikation: • Sei A die n×n-Adjazenzmatrix von Graph G mit Knotenmenge {1,…,n} • Was ist A⋅A? Behauptung 45: Sei Z= A⋅A. Dann gilt zij >0, g.d.w. es in G einen Pfad der Länge 2 von Knoten i zu Knoten j gibt. 57 Graphalgorithmen Behauptung 46: Sei Z‘= A⋅A + A. Dann gilt, dass z‘ij >0, g.d.w. es einen Weg der Länge 1 oder 2 von Knoten i zu Knoten j gibt. Konstruiere Matrix B mit: • bij =1 ⇔ z ij >0 Behauptung 47: Matrix B hat einen Weg von Knoten i nach j, g.d.w. Matrix A einen solchen Weg hat. 58 Graphalgorithmen Behauptung 48: Sei P ein Weg der Länge k>1 in G. Dann hat P maximal Länge 2/3 k in dem von Matrix B beschriebenen Graph G‘. Konsquenz aus Beh. 47 und 48: • Wenn wir die Berechnung von B log 3/2 n mal iterieren, haben wir die transitive Hülle berechnet 59 Graphalgorithmen TransitiveHülle(A) 1. for i←1 to log3/2 n do 2. Z‘ ← A A+A 3. for i←1 to n do 4. for j←1 to n do 5. if z ij >0 then bij ←1 else b ij ←0 6. A←B 7. return A 60 Graphalgorithmen Satz 48: Der Algorithmus TransitiveHülle berechnet die transitive Hülle eines Graphen G in O(M(n) log n) Zeit, wobei M(n) die Laufzeit zur Matrixmultiplikation bezeichnet. 61