todo

  • cosa risolve
  • idea
  • problema con i pesi negativi
  • esempio in cui sbaglia
  • alternativa (costosa, perché diventa n volte più lento) con bfs e nodi dummy

Implementazioni

Con liste

L’implementazione con le liste costa .

Con heap

L’implementazione con l’heap costa

import heapq
 
def dijkstra(grafo, radice):
    # Distanze minime dalla radice (inizializzate a infinito)
    distanze = {nodo: float('inf') for nodo in grafo}
    distanze[radice] = 0
    # Predecessori per ricostruire i percorsi
    predecessori = {nodo: None for nodo in grafo}
    # Heap: (distanza, nodo)
    heap = [(0, radice)]
 
    while heap:
        distanza_corrente, nodo_corrente = heapq.heappop(heap)
        
        # Salta se abbiamo già trovato una distanza migliore
        if distanza_corrente > distanze[nodo_corrente]:
            continue
            
        for vicino, costo in grafo[nodo_corrente]:
            nuova_distanza = distanza_corrente + costo
            if nuova_distanza < distanze[vicino]:
                distanze[vicino] = nuova_distanza
                predecessori[vicino] = nodo_corrente
                heapq.heappush(heap, (nuova_distanza, vicino))
    
    return distanze, predecessori