Sei sulla pagina 1di 13

Algoritmi e Strutture Dati

Capitolo 13
Cammini minimi:
Algoritmo di Dijkstra

Algoritmi e strutture dati

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano

Punto della situazione


Algoritmo basato sullordinamento topologico: albero dei
cammini minimi in grafi diretti aciclici. Complessit (n+m) (con
liste di adiacenza).
Algoritmo di Bellman&Ford: albero dei cammini minimi per tutti i
grafi che non contengono cicli negativi. Complessit (nm) (con
liste di adiacenza).

Copyright 2004 - The McGraw - Hill Companies, srl

Algoritmi e strutture dati

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano

Algoritmo di Dijkstra
(albero dei cammini minimi
in grafi con pesi non negativi)

Copyright 2004 - The McGraw - Hill Companies, srl

Algoritmi e strutture dati

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano

Estendere lalbero dei cammini minimi


Lemma di Dijkstra (1959): Sia G=(V,E,w) (diretto o non diretto) con
pesi non negativi, e sia T un sottoalbero dellalbero dei cammini minimi
radicato in s che include s ma non include tutti i vertici raggiungibili da
s. Sia (u,v) larco che minimizza la quantit dst+ w(t,z), per ogni tT e
zT. Allora, (u,v) appartiene a un cammino minimo da s a v.
Dim.: Supponiamo per assurdo che (u,v) non appartenga ad un
cammino minimo da s a v, e quindi che dsv< dsu+w(u,v). Allora, dsv
la lunghezza di un cammino minimo da s a v che non passa per (u,v).
Tale cammino, per uscire da T, deve allora passare per un qualche
arco (x,y)(u,v), con xT e yT. Sia quindi sv = <s,,x,y,,v>.

Copyright 2004 - The McGraw - Hill Companies, srl

Algoritmi e strutture dati

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano

Per la minimalit dei sottocammini di un cammino minimo:


w(sv) = w(sy) + w(yv) = dsx+ w(x,y) + w(yv).
Poich (u,v) minimizza dst+ w(t,z) per ogni tT e zT, allora:
dsx+ w(x,y) dsu+ w(u,v)
e quindi:
w(sv) dsu+ w(u,v) + w(yv)
e poich w(yv) 0, ne segue dsv w(sv) dsu+ w(u,v), assurdo (avevamo
supposto dsv < dsu+ w(u,v)).
5

Copyright 2004 - The McGraw - Hill Companies, srl

Algoritmi e strutture dati

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano

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.

Copyright 2004 - The McGraw - Hill Companies, srl

Algoritmi e strutture dati

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano

Pseudocodice

Nota:Tunalberoche
contienetuttiinodigi
aggiuntiallasoluzione
(ovveroquelliperiquali
gistatotrovatoil
camminominimodas),
piinodicorrentemente
contenutinellacodadi
priorit,ciascuno
connessoalrispettivo
nodopadre;nonva
confusoconlalberoT
consideratonellemma
diDijkstra!

Copyright 2004 - The McGraw - Hill Companies, srl

Algoritmi e strutture dati

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano

Esempio (1/2)

Copyright 2004 - The McGraw - Hill Companies, srl

Algoritmi e strutture dati

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano

Esempio (2/2)

Copyright 2004 - The McGraw - Hill Companies, srl

Algoritmi e strutture dati

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano

Tempo di esecuzione: implementazioni elementari


Supponendo che il grafo G sia rappresentato tramite liste di adiacenza, e
supponendo che tutti i nodi siano connessi ad s, avremo n insert, n
deleteMin e al pi m decreaseKey nella coda di priorit, al costo di:

10

Insert

DelMin

DecKey

Array non ord.

O(1)

O(n)

O(1)

Array ordinato

O(n)

O(1)

O(n)

Lista non ord.

O(1)

O (n)

O(1)

Lista ordinata

O(n)

O(1)

O(n)

nO(1) + nO(n) + O(m)O(1) = O(n2) con array non ordinati


nO(n) + nO(1) + O(m)O(n) = O(mn) con array ordinati
nO(1) + nO(n) + O(m)O(1) = O(n2) con liste non ordinate
nO(n) + nO(1) + O(m)O(n) = O(mn) con liste ordinate
Copyright 2004 - The McGraw - Hill Companies, srl

Algoritmi e strutture dati

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano

Osservazione sulla decreaseKey


Ricordiamo che le complessit computazionali esposte
per la decreaseKeysono valide supponendo di avere
un puntatore diretto allelemento su cui eseguire
loperazione. Come possiamo garantire tale condizione?
Semplicemente mantenendo un puntatore tra il nodo v
nellarray dei nodi della lista di adiacenza del grafo e
lelemento nella coda di priorit associato al nodo v; tale
puntatore viene inizializzato nella fase di inserimento di
questultimo allinterno della coda.

11

Copyright 2004 - The McGraw - Hill Companies, srl

Algoritmi e strutture dati

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano

Tempo di esecuzione: implementazioni efficienti


Supponendo che il grafo G sia rappresentato tramite liste di adiacenza, e
supponendo che tutti i nodi siano connessi ad s, avremo n insert, n
deleteMin e al pi m decreaseKey nella coda di priorit, al costo di:

Insert DelMin DecKey


Heap binario

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

Copyright 2004 - The McGraw - Hill Companies, srl

Algoritmi e strutture dati

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano

Approfondimento
Applicare lalgoritmo di Dijkstra con sorgente
s sul seguente grafo: s
5
a
c

1
3

b
5
d

1
13

Copyright 2004 - The McGraw - Hill Companies, srl

Potrebbero piacerti anche