Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
pdf)
Bellman Ford
Bellman ford pu calcolare il cammino minimo anche in presenza di archi con peso
negativo, a condizione che non esistano cicli con peso complessivo negativo, la
distanza tra qualunque coppia di nodi presenti nel ciclo sarebbe
INFINITE(posso ripassare infinite volte nel ciclo per diminuire il costo
totale), esso avviene per tutte le coppie di nodi presenti nella stessa
componente connessa.
Per ogni nodo viene mantenuto in dist[v] la distanza del cammino minimo pi
breve da s a v, fin'ora trovato, e in pred[v] il nodo che precede v in tale
cammino(NB pred[s]=s)
Correttezza:
Visto che non possono esserci, per ipotesi, cicli di peso negativo l'algoritmo
eseguir n-1 iterazioni, se l'algoritmo effettuasse pi di n iterazioni i
cammini minimi non cambierebbero e se esistessero cicli di peso negativo il
valore di dist[v] si decrementerebbero all'infinito
Costo : O(n) iterazioni in cui esaminiamo l'arco 2 volte per cui O(m) quindi
O(n*m), e se volessimo farlo per ogni nodo risulterebbe assai costoso per
questo si pensa a un altro algoritmo
Per i cammini minimi tra tutti i nodi sarebbe sufficiente applicare questo
algoritmo n volte, ma il costo risulterebbe eccessivo; vediamo di sfruttare
qualche principio di programmazione dinamica; per ottenere i sotto problemi pi,
dobbiamo limitare la lunghezza dei cammini tra i quali scegliere.
Definiamo quindi il problema Pk,i, cio trovare il cammino al nodo i di
lunghezza massima k.
L'idea molto semplice:
1. Per ogni nodo u, troviamo la il cammino minimo pi breve che porta a i(non
destinazione), con al massimo un arco, altrimenti segnamo infinito
1. Nel caso fosse < k risulta evidente che anche una soluzione ammissibile
per Pk-1,i
2. Nel caso fosse = k allora definiamo j il nodo che si attraversa per
raggiungere i attraverso l'arco (j,i) togliendo quest'arco otteniamo un
cammino S' lungo k-1 che una soluzione ammissibile per Pk-1,j
Dimostrazione:
Soluzione:
Per ricostruire la soluzione ottimale mi basta scorrere l'array dei nodi padre