Eingabe APSP

Werbung
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
Herunterladen