La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

1/31 Cammini minimi con sorgente singola. 2/31 Cammini minimi con sorgente singola.

Presentazioni simili


Presentazione sul tema: "1/31 Cammini minimi con sorgente singola. 2/31 Cammini minimi con sorgente singola."— Transcript della presentazione:

1 1/31 Cammini minimi con sorgente singola

2 2/31 Cammini minimi con sorgente singola

3 3/31 Cammini minimi con sorgente singola Dato un grafo (orientato o non orientato) G = (V,E) con funzione di peso w: E R e dato un particolare vertice s V, il problema chiede di trovare per ogni vertice v V il cammino di peso minimo da s a v. Altri casi: trovare il cammino minimo fra una coppia di vertici u e v. trovare i cammini minimi fra tutte le coppie di vertici. Ipotesi: nel grafo non esistono cicli di peso negativo.

4 4/31 Rappresentazione I cammini vengono rappresentati analogamente agli alberi BFS. Per ogni vertice v V si mantiene un predecessore (v). I valori di inducono un sottografo dei predecessori G =(V,E ). G è un albero di cammini minimi, cioè: V è linsieme dei vertici raggiungibili da s in G. G forma un albero con radice in S per ogni v V, lunico cammino semplice da s a v in G è un cammino minimo da s a v in G.

5 5/31 Algoritmo di Dijkstra: InitializeSingleSource Initialize-Single-Source(G, s) 1foreach v V[G] do 2d[v] = 3p[v] = nil 4d[s] = 0 Algoritmo basato su un rilassamento: in d[v] si tiene un limite superiore al costo del cammino minimo da s a v (stima di cammino minimo). p[v]: predecessore del vertice v. Inizializzazione delle strutture:

6 6/31 Algoritmo di Dijkstra: Relax Relax(u, v, w) 1if d[v] > d[u] + w(u,v) 2then d[v] = d[u] + w(u,v) 3 p[v] = u Rilassamento di un arco (u,v): verifica se è possibile migliorare il cammino minimo verso v passante per u trovato fino a quel momento. Se si, si aggiornano d[v] e p[v].

7 7/31 Algoritmo di Dijkstra Dijkstra(G,w,s) 1.Initialize-Single-Source(G,s) 2.S = 3.Q = V[G] 4.while Q 0 do 5.u = Extract-Min(Q) 6.S = S {u} 7.foreach v Adj[u] do 8.Relax(u,v,w) Mantiene un insieme S che contiene i vertici v il cui peso del cammino minimo da s, (s,v), è già stato determinato.

8 8/31 Algoritmo di Dijkstra

9 9/31 Algoritmo di Dijkstra: esempio

10 10/31 Algoritmo di Dijkstra: esempio

11 11/31 Algoritmo di Dijkstra: esempio

12 12/31 Algoritmo di Dijkstra: esempio

13 13/31 Algoritmo di Dijkstra: esempio

14 14/31 Algoritmo di Dijkstra: correttezza Teorema: Se si esegue lalgoritmo di Dijkstra su di un grafo orientato e pesato G=(V,E) con funzione di peso non negativa W e sorgente s, allora al termine vale d[u]= (s,u) per ogni vertice u V.

15 15/31 Algoritmo di Dijkstra: complessità InitializeSingleSource T I (V,E) = O(V) Relax T R (V,E) = O(1) Dijkstra (coda Q=V-S come array) T(V,E) = T I (V,E) + O(V 2 ) + E T R (V,E) = = O(V) + O(V 2 ) + E O(1) = O(V 2 +E) = O(V 2 )

16 16/31 Algoritmo di Bellman-Ford BellmanFord(G,w,s) 1Initialize-Single-Source(G,s) 2for i = 1 to |V[G] 1| do 3for (u,v) E[G] do 4Relax(u,v,w) 5for (u,v) E[G] do 6if d[v] > d[u] + w(u,v) 7then return false 8return true Possibili archi con peso negativo. Restituisce un booleano che dice se esiste un ciclo di peso negativo (nessuna soluzione) oppure produce lalbero dei cammini minimi.

17 17/31 Algoritmo di Bellman-Ford: esempio

18 18/31 Algoritmo di Bellman-Ford: esempio

19 19/31 Algoritmo di Bellman-Ford: esempio

20 20/31 Algoritmo di Bellman-Ford: esempio

21 21/31 Algoritmo di Bellman-Ford: esempio TRUE

22 22/31 Algoritmo di Bellman-Ford: correttezza Teorema Si esegua Bellman-Ford su un grafo orientato e pesato G=(V,E) con sorgente s e funzione di peso w: E R. Se G non contiene cicli di peso negativo lalgoritmo restituisce TRUE e si ha che d[v]= (s,v) per tutti i vertici v V e che il sottografo dei predecessori è un albero di cammini minimi radicato in s. Se G ha un ciclo di peso negativo, lalgoritmo restituisce FALSE.

23 23/31 Algoritmo di Bellman-Ford: complessità InitializeSingleSource T I (V,E) = O(V) Relax T R (V,E) = O(1) BellmanFord T(V,E) = T I (V,E) + V E T R (V,E) + E = = O(V) + V E O(1) + E = = O(V E)

24 24/31 Cammini minimi in DAG: SSSP-DAG DAG-Shortest-Path(G,w,s) 1 ordina topologicamente i vertici di G 2 Initialize-Single-Source(G,s) 3 foreach vertice u nellordine topologico do 4 foreach vertice v Adj[u] do 5 Relax(u,v,w) Rlassando gli archi di un grafo pesato G=(V,E) secondo un ordine topologico, si possono calcolare i cammini minimi da una singola sorgente in tempo O(V+E).

25 25/31 Cammini minimi in DAG: esempio

26 26/31 Cammini minimi in DAG: esempio

27 27/31 Cammini minimi in DAG: esempio

28 28/31 Cammini minimi in DAG: esempio

29 29/31 Cammini minimi in DAG: esempio

30 30/31 Cammini minimi in DAG: esempio

31 31/31 Cammini minimi in DAG: esempio

32 32/31 Cammini minimi in DAG: complessità T(V,E) = (V + E) + (V) + E (1) = (V + E)


Scaricare ppt "1/31 Cammini minimi con sorgente singola. 2/31 Cammini minimi con sorgente singola."

Presentazioni simili


Annunci Google