Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Capitolo 13
Cammini minimi:
Algoritmo di Dijkstra
Algoritmo di Dijkstra
(albero dei cammini minimi
in grafi con pesi non negativi)
Approccio di Dijkstra
Dato un nodo u in T, scegli un nodo vT che
minimizza la quantit Dsu+w(u,v)dsu+w(u,v)= dsv,
aggiungi v a T ed effettua il passo di rilassamento
su ogni nodo yT adiacente a v (per il quale cio
(v,y)E).
I nodi da aggiungere progressivamente a T sono
mantenuti in una coda di priorit, associati ad un unico
arco che li connette a T. Se y in coda con arco (x,y)
associato,esedopo aver aggiunto v a T troviamo un arco
(v,y) tale che Dsv+w(v,y) < Dsx+w(x,y), allora
rimpiazziamo (x,y) con (v,y), ed aggiorniamo Dsy.
Pseudocodice
Nota:Tunalberoche
contienetuttiinodigi
aggiuntiallasoluzione
(ovveroquelliperiquali
gistatotrovatoil
camminominimodas),
piinodicorrentemente
contenutinellacodadi
priorit,ciascuno
connessoalrispettivo
nodopadre;nonva
confusoconlalberoT
consideratonellemma
diDijkstra!
Esempio (1/2)
Esempio (2/2)
10
Insert
DelMin
DecKey
O(1)
O(n)
O(1)
Array ordinato
O(n)
O(1)
O(n)
O(1)
O (n)
O(1)
Lista ordinata
O(n)
O(1)
O(n)
11
O(log
n)
O(log n)
O(log n)
Heap Binom.
O(log
n)
O(log n)
O(log n)
Heap Fibon.
O(1)
O(log n)*
O(1)*
(ammortizzata)
(ammortizzata)
nO(log n) + nO(log n) + O(m)O(log
n) =
O(mlog n)
utilizzando heap binari o binomiali
nO(1) + nO(log n)* + O(m)O(1)* = O(m + nlog n) utilizzando
heap di Fibonacci (si osservi e lo si dimostri limitatamente ai
vari metodi presentati che questa complessit computazionale
il miglior upper bound noto alla complessit del problema!)
12
Approfondimento
Applicare lalgoritmo di Dijkstra con sorgente
s sul seguente grafo: s
5
a
c
1
3
b
5
d
1
13