मैं यह समझने की कोशिश कर रहा हूं कि क्यों डायजेक्स्ट्रा का एल्गोरिदम नकारात्मक भार के साथ काम नहीं करेगा। सबसे छोटे रास्तों पर एक उदाहरण पढ़कर , मैं निम्नलिखित परिदृश्य का पता लगाने की कोशिश कर रहा हूं:
2
A-------B
\ /
3 \ / -2
\ /
C
वेबसाइट से:
किनारों को मानकर सभी को बाएं से दाएं निर्देशित किया जाता है, अगर हम A से शुरू करते हैं, तो दिक्जस्ट्रा का एल्गोरिथ्म किनारे (A, x) को कम से कम d (A, A) + लंबाई (एज), अर्थात् (A, B) का चयन करेगा। यह तब d (A, B) = 2 सेट करता है और दूसरा किनारा (y, C) चुनता है d (A, y) + d (y, C); एकमात्र विकल्प (ए, सी) है और यह डी (ए, सी) = 3 सेट करता है। लेकिन यह कभी भी ए से बी तक, सी के माध्यम से, कुल लंबाई 1 के साथ सबसे छोटा रास्ता नहीं ढूंढता है।
मुझे समझ में नहीं आ रहा है कि दिक्जस्ट्रा के निम्नलिखित कार्यान्वयन का उपयोग करते हुए, d [B] को अपडेट नहीं किया जाएगा 1
(जब एल्गोरिथ्म शीर्ष C पर पहुंचता है, तो यह B पर एक आराम चलाएगा, देखें कि d [B] के बराबर है 2
, और इसलिए अद्यतन करें इसका मूल्य 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)
}
धन्यवाद,
मीर