Algoritmi e Strutture Dati Capitolo 13 Cammini minimi: Algoritmo di Dijkstra; Algoritmo di Floyd e Warshall
Punto della situazione Algoritmo di ordinamento topologico: albero dei cammini minimi in grafi (diretti) aciclici. Complessità Θ(n+m) (con liste di adiacenza). Come si ottiene? Basta associare inizialmente ad ogni nodo il proprio grado entrante. Tale valore può essere calcolato in Θ(n+m) scorrendo le liste di adiacenza. Quindi, manteniamo una lista Z dei nodi con grado entrante pari a 0. Tale lista si può costruire in Θ(n), ovviamente. Quindi, selezioniamo un elemento di tale lista e lo eliminiamo dal grafo, assieme a tutti gli archi uscenti. Per ogni arco uscente eliminato, diminuiamo di 1 il grado entrante del nodo di arrivo corrispondente, ed aggiungiamo eventualmente il nodo a Z se il suo grado entrante si è azzerato. Algoritmo di Bellman&Ford: albero dei cammini minimi per tutti i grafi che non contengono cicli negativi. Complessità Θ(n·m) (con liste di adiacenza). Copyright © 2004 - The McGraw - Hill Companies, srl
(albero dei cammini minimi in grafi con pesi non negativi) Algoritmo di Dijkstra (albero dei cammini minimi in grafi con pesi non negativi) Copyright © 2004 - The McGraw - Hill Companies, srl
Estendere l’albero dei cammini minimi Lemma di Dijkstra (1959): Sia G=(V,E,w) diretto con pesi non negativi, e sia T un sottoalbero dell’albero dei cammini minimi radicato in s che include s ma non include tutti i vertici raggiungibili da s. Sia (u,v) l’arco 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
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)). □ Copyright © 2004 - The McGraw - Hill Companies, srl
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 con priorità, associati ad un (unico) arco che li connette a T. Se y è in coda con arco (x,y) associato, e se analizzando (v,y) dopo aver aggiunto v a T risulta Dsv+w(v,y) < Dsx+w(x,y) , rimpiazziamo (x,y) con (v,y), ed aggiorniamo Dsy. Copyright © 2004 - The McGraw - Hill Companies, srl
Pseudocodice Nota: T è un albero che contiene tutti i nodi già aggiunti alla soluzione (ovvero quelli per i quali è già stato trovato il cammino minimo da s), più i nodi correntemente contenuti nella coda di priorità, ciascuno connesso al rispettivo nodo padre; non va confuso con l’albero T considerato nel lemma di Dijkstra! Copyright © 2004 - The McGraw - Hill Companies, srl
Tempo di esecuzione: implementazioni elementari Al più n insert, n deleteMin e m decreaseKey nella coda di priorità Insert DelMin DecKey Array ordinato O(log n) O(1) O(n) Array non ord. Lista Ordinata Lista non ord. O(n log n+n+mn)=O(mn) con array ordinati O(n+n2+m log n)=O(n2+m log n) con array non ordinati O(n2 log n+n+m)=O(n2 log n) con liste ordinate O(n+n2+mn)=O(mn) con liste non ordinate Copyright © 2004 - The McGraw - Hill Companies, srl
Tempo di esecuzione: implementazioni efficienti Al più n insert, n deleteMin e m decreaseKey nella coda di priorità Insert DelMin DecKey Heap binario O(log n) Heap Binom. Heap Fibon. O(1) O(n log n+n log n+m log n)=O(m log n) utilizzando heap (binari o binomiali) O(n+n log n+m)=O(m+n log n) con heap di Fibonacci Copyright © 2004 - The McGraw - Hill Companies, srl
Esempio (1/2) Copyright © 2004 - The McGraw - Hill Companies, srl
Esempio (2/2) Copyright © 2004 - The McGraw - Hill Companies, srl
Approfondimento Applicare l’algoritmo di Dijkstra con sorgente s sul seguente grafo: s 5 1 a b 3 4 5 c d 1 Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmo di Floyd e Warshall (cammini minimi tra tutte le coppie di nodi per tutti i grafi che non contengono cicli negativi) Copyright © 2004 - The McGraw - Hill Companies, srl
Approccio Elegante applicazione della tecnica della programmazione dinamica Supponiamo di enumerare i vertici di G da 1 a n, cioè V={v1, v2, … vn}. Un cammino minimo k-vincolato da x a y è un cammino di costo minimo tra tutti i cammini da x a y che usano come vertici intermedi un sottoinsieme (anche vuoto) dei vertici {v1, v2, … vk}. v2 Tra x e y, il cammino minimo: 0-vincolato è lungo + 1-vincolato è lungo + 2-vincolato è lungo 8: <x,v2,y>; 3-vincolato è lungo 6: <x,v3,v2,y>; 4-vincolato (ovvero senza vincoli) è lungo 6. 7 1 x=v1 1 y=v4 4 3 v3 Idea di Floyd e Warshall: calcolare cammini minimi k-vincolati per k=1,…, n Copyright © 2004 - The McGraw - Hill Companies, srl
Relazioni tra distanze vincolate k Sia dxy il costo di un cammino minimo k-vincolato da x a y. Chiaramente, valgono le seguenti proprietà: dxy= w(x,y) se (x,y)E, +∞ altrimenti d = d e d = d dxy= dxy k-1 k k-1 k xvk xvk vkx vkx n Per le proprietà di cui sopra e per la proprietà di minimalità dei sottocammini di cammini minimi, si ha: L’algoritmo calcola dxy dal basso verso l’alto, incrementando k da 0 a n Copyright © 2004 - The McGraw - Hill Companies, srl
Pseudocodice Tempo di esecuzione: (n3) D: Come si confronta con l’applicazione ripetuta di Dijkstra? R: Utilizzando gli Heap di Fibonacci, n applicazioni dell’algoritmo di Dijkstra richiederanno tempo O(n (m+n log n))=O(nm+n2 log n)=O(n3). Quindi, Dijkstra è più efficiente. Tuttavia, si applica solo su un sottoinsieme delle istanze ammissibili per F&W. Copyright © 2004 - The McGraw - Hill Companies, srl
Sommario grafico Universo dei grafi Grafi senza cicli negativi: BF e FW Grafi aciclici: ordinamento topologico Grafi senza archi negativi: Dijkstra Copyright © 2004 - The McGraw - Hill Companies, srl
Approfondimento Applicare l’algoritmo di Floyd e Warshall al seguente grafo: s 5 -1 a b 3 -4 5 c d -1 Copyright © 2004 - The McGraw - Hill Companies, srl