पाठ 18 / 42

Dijkstra's Algorithm

एक weighted graph में गैर-ऋणात्मक edges के साथ, एक source से सभी nodes तक सबसे छोटे रास्ते खोजता है।

Min-heap पर Greedy

Dijkstra एक dist[] array रखता है जो source (0) को छोड़कर infinity पर initialize होता है, और हमेशा अगले में सबसे नज़दीकी unvisited node को एक min-heap से expand करता है। एक बार कोई node उसकी final distance के साथ pop हो जाए, तो वह फिर नहीं देखा जाता — यह greedy चुनाव सुरक्षित है क्योंकि सभी edge weights गैर-ऋणात्मक हैं।

क्रियान्वयन

(distance, node) tuples push करें; heap हमेशा सबसे छोटी distance पहले देता है। पुराने entries छोड़ें जहाँ पहले ही छोटा रास्ता मिल चुका हो।

import heapq

def dijkstra(n, g, src):
    dist = [float('inf')] * n
    dist[src] = 0
    pq = [(0, src)]
    while pq:
        d, u = heapq.heappop(pq)
        if d > dist[u]:
            continue
        for v, w in g[u]:
            nd = d + w
            if nd < dist[v]:
                dist[v] = nd
                heapq.heappush(pq, (nd, v))
    return dist

Output:

# g[u] = list of (neighbour, weight)
dijkstra(5, g, 0)  # -> shortest distance from node 0 to all others

Complexity और सीमाएँ

Binary heap के साथ: O((V+E) log V)। Dijkstra negative edge weights के साथ विफल होता है — बाद का सस्ता रास्ता पहले से finalize हुई distance को कमज़ोर कर सकता है। जब negatives संभव हों तो Bellman-Ford इस्तेमाल करें।

त्वरित जांच

मुख्य शर्त परखें।

त्वरित जाँच: Dijkstra's algorithm सही परिणाम केवल तब देता है जब:

  • Graph undirected हो
  • सभी edge weights गैर-ऋणात्मक हों
  • Graph में कोई cycle न हो
  • Graph एक tree हो
Answer

सभी edge weights गैर-ऋणात्मक हों — Negative weights greedy 'सबसे नज़दीकी node final है' मान्यता को गलत कर सकते हैं — इसकी जगह Bellman-Ford इस्तेमाल करें।