Ich versuche zu verstehen, warum der Dijkstra-Algorithmus nicht mit negativen Gewichten funktioniert. Wenn ich ein Beispiel für kürzeste Wege lese , versuche ich, das folgende Szenario herauszufinden:
2
A-------B
\ /
3 \ / -2
\ /
C
Von der Website:
Angenommen, die Kanten sind alle von links nach rechts gerichtet. Wenn wir mit A beginnen, wählt der Dijkstra-Algorithmus die Kante (A, x), die d (A, A) + Länge (Kante) minimiert, nämlich (A, B). Es setzt dann d (A, B) = 2 und wählt eine andere Kante (y, C), die d (A, y) + d (y, C) minimiert; Die einzige Wahl ist (A, C) und es wird d (A, C) = 3 gesetzt. Es findet jedoch nie den kürzesten Weg von A nach B über C mit der Gesamtlänge 1.
Ich kann nicht verstehen, warum bei Verwendung der folgenden Implementierung von Dijkstra d [B] nicht aktualisiert wird auf 1
(Wenn der Algorithmus den Scheitelpunkt C erreicht, wird eine Relaxation für B ausgeführt, um sicherzustellen, dass d [B] gleich 2
ist und daher aktualisiert wird seinen Wert zu 1
).
Dijkstra(G, w, s) {
Initialize-Single-Source(G, s)
S ← Ø
Q ← V[G]//priority queue by d[v]
while Q ≠ Ø do
u ← Extract-Min(Q)
S ← S U {u}
for each vertex v in Adj[u] do
Relax(u, v)
}
Initialize-Single-Source(G, s) {
for each vertex v V(G)
d[v] ← ∞
π[v] ← NIL
d[s] ← 0
}
Relax(u, v) {
//update only if we found a strictly shortest path
if d[v] > d[u] + w(u,v)
d[v] ← d[u] + w(u,v)
π[v] ← u
Update(Q, v)
}
Vielen Dank,
Meir