Algoritmi e Strutture Dati Cammini minimi Definizioni Sia G = (V,E) un grafo orientato pesato sugli archi. Il costo di un cammino π = <v 0,v 1,v 2,,v k > è dato da: Un cammino minimo tra una coppia di vertici x e y è un cammino di costo minore o uguale a quello di ogni altro cammino tra gli stessi vertici. 2
Proprietà dei cammini minimi Sottostruttura ottima: ogni sottocammino di un cammino minimo è anch esso minimo Grafi con cicli negativi: se due vertici x e y appartengono a un ciclo di costo negativo, non esiste nessun cammino minimo finito tra di essi Se G non contiene cicli negativi, tra ogni coppia di vertici connessi in G esiste sempre un cammino minimo semplice, in cui cioè tutti i vertici sono distinti 3 Distanza fra vertici La distanza d xy tra due vertici x e y è il costo di un cammino minimo da x a y (o + se i due vertici non sono connessi) Disuguaglianza triangolare: per ogni x, y e z Condizione di Bellman: per ogni arco (u,v) e per ogni vertice s 4
Alberi di cammini minimi Un arco (u,v) appartiene a un cammino minimo a partire da un vertice s se e solo se u è raggiungibile da s e d su + w(u,v) = d sv I cammini minimi da un vertice s a tutti gli altri vertici del grafo possono essere rappresentati tramite un albero radicato in s, detto albero dei cammini minimi 5 Calcolare cammini minimi da distanze Problema: Le distanze non sono note (è proprio quello che vogliamo trovare!) 6
Tecnica del rilassamento Partiamo da stime per eccesso delle distanze D xy d xy e aggiorniamole decrementandole progressivamente fino a renderle esatte. Aggiorniamo le stime basandoci sul seguente passo di rilassamento: 7 Algoritmo generico per il calcolo delle distanze Rilassamento 8
Algoritmo di Bellman e Ford (per cammini minimi a sorgente singola) 9 Ordine di rilassamento Sia π = < s,v 1,v 2,,v k > un cammino minimo. Se fossimo in grado di eseguire i passi di rilassamento nell ordine seguente: in k passi avremmo la soluzione. Purtroppo non conosciamo l ordine giusto, essendo π ignoto! 10
Approccio di Bellman e Ford Esegui n passate In ciascuna passata rilassa tutti gli archi Dopo la j-esima passata, i primi j rilassamenti corretti sono stati certamente eseguiti Esegue però molti rilassamenti inutili! 11 Pseudocodice Tempo di esecuzione: O(n m) 12
Algoritmo per grafi diretti aciclici (per cammini minimi a sorgente singola) 13 Ordinamento topologico Funzione σ: V {1, n} tale che σ(u) < σ(v) se esiste un cammino da u a v in G Esiste se e solo se G è aciclico 14
Calcolo di un ordinamento topologico Tempo di esecuzione: O(n+m) 15 Cammini minimi in grafi aciclici Eseguire i rilassamenti in ordine topologico Tempo di esecuzione: O(n+m) 16
Algoritmo di Dijkstra (per cammini minimi a sorgente singola in grafi con costi non negativi) 17 Estendere l albero dei cammini minimi Sia T un albero dei cammini minimi radicato in s che non include tutti i vertici raggiungibili da s, sia (u,v) t.c. u T e v T, e t.c. (u,v) minimizza la quantità d su + w(u,v) : allora (u,v) appartiene a un cammino minimo da s a v 18
Algoritmo di Dijkstra Scegli arco (u,v) con u T e v T che minimizza quantità D su + w(u,v), effettua rilassamento D sv D su + w(u,v), ed aggiungi (u,v) a T Archi incidenti in T mantenuti in coda con priorità (un solo arco per ogni nodo v T): se (u,v) è già in coda quando analizzi (z,v) e risulta D sz + w(z,v) < D su + w(u,v), rimpiazza (u,v) con (z,v) 19 Pseudocodice 20
Esempio (1/2) 21 Esempio (2/2) 22
Tempo di esecuzione Al più: n deletemin, n insert e m decreasekey O(m log n) utilizzando heap O(m + n log n) utilizzando heap di Fibonacci 23 Algoritmo di Floyd e Warshall (per cammini minimi tra tutte le coppie) 24
Elegante applicazione della tecnica di programmazione dinamica Approccio Un cammino minimo k-vincolato da x a y è un cammino di costo minimo tra tutti i cammini da x a y che usano solo i vertici {v 1, v 2, v k } Idea di Floyd e Warshall: calcolare cammini minimi k-vincolati 25 Relazioni tra distanze vincolate k Sia d xy il costo di un cammino minimo k-vincolato da x a y. Risulta: 0 d xy = w(x,y) se (x,y) E, + altrimenti d xy = d xy n L algoritmo calcola d xy dal basso verso l alto, incrementando k da 1 a n 26
Pseudocodice Tempo di esecuzione: O(n 3 ) 27 Riepilogo Algoritmi classici per il calcolo di distanze (e quindi di cammini minimi), basati sulla tecnica del rilassamento: Bellman e Ford: cammini minimi a sorgente singola, grafi diretti senza cicli negativi, tempo O(nm) Grafi diretti aciclici: cammini minimi a sorgente singola in tempo O(n+m) Dijkstra: cammini minimi a sorgente singola, grafi diretti senza pesi negativi, tempo O(m + n log n) Floyd e Warshall: cammini minimi tra tutte le coppie in tempo O(n 3 ) 28