cammini minimi con sorgente singola. dato un grafo (orientato o non orientato) g = (v,e) con...
TRANSCRIPT
![Page 1: 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,](https://reader035.vdocuments.mx/reader035/viewer/2022062701/5542eb66497959361e8d2661/html5/thumbnails/1.jpg)
Cammini minimi con sorgente singola
![Page 2: 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,](https://reader035.vdocuments.mx/reader035/viewer/2022062701/5542eb66497959361e8d2661/html5/thumbnails/2.jpg)
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 sV, il problema chiede di trovare per ogni vertice vV 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.
![Page 3: 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,](https://reader035.vdocuments.mx/reader035/viewer/2022062701/5542eb66497959361e8d2661/html5/thumbnails/3.jpg)
Rappresentazione
I cammini vengono rappresentati analogamente agli alberi BFS.
Per ogni vertice vV si mantiene un predecessore (v).
I valori di inducono un sottografo dei predecessori G=(V,E).
G è un albero di cammini minimi, cioè:
• V è l’insieme dei vertici raggiungibili da s in G.
• G forma un albero con radice in S
• per ogni vV, l’unico cammino semplice da s a v in G è un cammino minimo da s a v in G.
![Page 4: 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,](https://reader035.vdocuments.mx/reader035/viewer/2022062701/5542eb66497959361e8d2661/html5/thumbnails/4.jpg)
Algoritmo di Dijkstra: InitializeSingleSource
Initialize-Single-Source(G,s)1 foreach v V[G] do2 d[v] = 3 p[v] = nil4 d[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:
![Page 5: 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,](https://reader035.vdocuments.mx/reader035/viewer/2022062701/5542eb66497959361e8d2661/html5/thumbnails/5.jpg)
Algoritmo di Dijkstra: Relax
Relax(u, v, w)1 if d[v] > d[u] + w(u,v)2 thend[v] = d[u] + w(u,v)3 p[v] = u
Rilassamento di un arco (u,v): verifica se è possibile migliorare il cammino minimo per v passante per u trovato fino a quel momento.Se si, si aggiornano d[v] e p[v].
![Page 6: 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,](https://reader035.vdocuments.mx/reader035/viewer/2022062701/5542eb66497959361e8d2661/html5/thumbnails/6.jpg)
Algoritmo di Dijkstra
Dijkstra(G, w, s)1. Initialize-Single-Source(G, s)2. S = 3. Q = V[G]4. while Q 0 do5. u = Extract-Min(Q)6. S = S {u}7. for u Adj[u] do8. 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.
![Page 7: 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,](https://reader035.vdocuments.mx/reader035/viewer/2022062701/5542eb66497959361e8d2661/html5/thumbnails/7.jpg)
Algoritmo di Dijkstra
10
1
5
2
649
7
2 3
0
![Page 8: 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,](https://reader035.vdocuments.mx/reader035/viewer/2022062701/5542eb66497959361e8d2661/html5/thumbnails/8.jpg)
Algoritmo di Dijkstra: esempio
1010
1
5
2
649
7
2 3
5
0
![Page 9: 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,](https://reader035.vdocuments.mx/reader035/viewer/2022062701/5542eb66497959361e8d2661/html5/thumbnails/9.jpg)
Algoritmo di Dijkstra: esempio
810
1
5
2
649
7
2 3
7
14
0
5
![Page 10: 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,](https://reader035.vdocuments.mx/reader035/viewer/2022062701/5542eb66497959361e8d2661/html5/thumbnails/10.jpg)
Algoritmo di Dijkstra: esempio
810
1
5
2
649
7
2 3
13
0
5 7
![Page 11: 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,](https://reader035.vdocuments.mx/reader035/viewer/2022062701/5542eb66497959361e8d2661/html5/thumbnails/11.jpg)
Algoritmo di Dijkstra: esempio
10
1
5
2
649
7
2 3
9
0
5 7
8
![Page 12: 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,](https://reader035.vdocuments.mx/reader035/viewer/2022062701/5542eb66497959361e8d2661/html5/thumbnails/12.jpg)
Algoritmo di Dijkstra: esempio
10
1
5
2
649
7
2 30
5 7
8 9
![Page 13: 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,](https://reader035.vdocuments.mx/reader035/viewer/2022062701/5542eb66497959361e8d2661/html5/thumbnails/13.jpg)
Algoritmo di Dijkstra: correttezza
Teorema:Se si esegue l’algoritmo 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 uV.
![Page 14: 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,](https://reader035.vdocuments.mx/reader035/viewer/2022062701/5542eb66497959361e8d2661/html5/thumbnails/14.jpg)
Algoritmo di Dijkstra: complessità
InitializeSingleSource TI(V,E) = O(V)
Relax TR(V,E) = O(1)
Dijkstra (coda Q=V-S come array)
T(V,E) = TI(V,E) + O(V2) + E TR(V,E) =
= O(V) + O(V2) + E O(1) = O(V2+E) = O(V2)
![Page 15: 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,](https://reader035.vdocuments.mx/reader035/viewer/2022062701/5542eb66497959361e8d2661/html5/thumbnails/15.jpg)
Algoritmo di Bellman-Ford
SSSP-BellmanFord(G, w, s)1 Initialize-Single-Source(G, s)2 for i = 1 to |V[G] 1| do3 for (u,v) E[G] do4 Relax(u,v,w)5 for (u,v) E[G] do6 if d[v] > d[u] + w(u,v)7 then return false8 return true
Possibili archi con peso negativo.Restituisce un booleano che dice se esiste un ciclo di peso negativo (nessuna soluzione) oppure produce l’albero dei cammini minimi.
![Page 16: 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,](https://reader035.vdocuments.mx/reader035/viewer/2022062701/5542eb66497959361e8d2661/html5/thumbnails/16.jpg)
Algoritmo di Bellman-Ford: esempio
0
6
7
7-3
2
8-4
9
5-2
![Page 17: 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,](https://reader035.vdocuments.mx/reader035/viewer/2022062701/5542eb66497959361e8d2661/html5/thumbnails/17.jpg)
Algoritmo di Bellman-Ford: esempio
0
66
7
7-3
2
8-4
9
5-2
7
![Page 18: 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,](https://reader035.vdocuments.mx/reader035/viewer/2022062701/5542eb66497959361e8d2661/html5/thumbnails/18.jpg)
Algoritmo di Bellman-Ford: esempio
0
66
7
7-3
2
8-4
9
5-2
27
4
![Page 19: 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,](https://reader035.vdocuments.mx/reader035/viewer/2022062701/5542eb66497959361e8d2661/html5/thumbnails/19.jpg)
Algoritmo di Bellman-Ford: esempio
0
26
7
7-3
2
8-4
9
5-2
27
4
![Page 20: 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,](https://reader035.vdocuments.mx/reader035/viewer/2022062701/5542eb66497959361e8d2661/html5/thumbnails/20.jpg)
Algoritmo di Bellman-Ford: esempio
0
26
7
7-3
2
8-4
9
5-2
-27
4
TRUE
![Page 21: 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,](https://reader035.vdocuments.mx/reader035/viewer/2022062701/5542eb66497959361e8d2661/html5/thumbnails/21.jpg)
Algoritmo di Bellman-Ford: correttezza
TeoremaSi esegua Bellman-Ford su un grafo orientato e pesato G=(V,E) con sorgente s e funzione di peso w: ER. Se G non contiene cicli di peso negativo l’algoritmo restituisce TRUE e si ha che d[v]=(s,v) per tutti i vertici vV e che il sottografo dei predecessori è un albero di cammini minimi radicato in s. Se G ha un ciclo di peso negativo, l’algoritmo restituisce FALSE.
![Page 22: 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,](https://reader035.vdocuments.mx/reader035/viewer/2022062701/5542eb66497959361e8d2661/html5/thumbnails/22.jpg)
Algoritmo di Bellman-Ford: complessità
InitializeSingleSource TI(V,E) = O(V)
Relax TR(V,E) = O(1)
BellmanFord
T(V,E) = TI(V,E) + V E TR(V,E) + E == O(V) + V E O(1) + E = = O(V E)
![Page 23: 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,](https://reader035.vdocuments.mx/reader035/viewer/2022062701/5542eb66497959361e8d2661/html5/thumbnails/23.jpg)
Cammini minimi in DAG: SSSP-DAG
DAG-Shortest-Path(G, w, s)1 ordina topologicamente i vertici di G2 Initialize-Single-Source(G, s)3 foreach vertice u nell’ordine topologico do 4 foreach vertice v Adj[u] do5 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).
![Page 24: 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,](https://reader035.vdocuments.mx/reader035/viewer/2022062701/5542eb66497959361e8d2661/html5/thumbnails/24.jpg)
Cammini minimi in DAG: esempio
0 5 2 7 -1 -2
6 1
3 42
![Page 25: 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,](https://reader035.vdocuments.mx/reader035/viewer/2022062701/5542eb66497959361e8d2661/html5/thumbnails/25.jpg)
Cammini minimi in DAG: esempio
0 5 2 7 -1 -2
6 1
3 42
![Page 26: 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,](https://reader035.vdocuments.mx/reader035/viewer/2022062701/5542eb66497959361e8d2661/html5/thumbnails/26.jpg)
Cammini minimi in DAG: esempio
6 25 2 7 -1 -2
6 1
3 42
0
![Page 27: 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,](https://reader035.vdocuments.mx/reader035/viewer/2022062701/5542eb66497959361e8d2661/html5/thumbnails/27.jpg)
Cammini minimi in DAG: esempio
6 6 4 5 2 7 -1 -2
6 1
3 42
0 2
![Page 28: 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,](https://reader035.vdocuments.mx/reader035/viewer/2022062701/5542eb66497959361e8d2661/html5/thumbnails/28.jpg)
Cammini minimi in DAG: esempio
5 4 5 2 7 -1 -2
6 1
3 42
0 2 6
![Page 29: 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,](https://reader035.vdocuments.mx/reader035/viewer/2022062701/5542eb66497959361e8d2661/html5/thumbnails/29.jpg)
Cammini minimi in DAG: esempio
3 5 2 7 -1 -2
6 1
3 42
0 2 6 5
![Page 30: 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,](https://reader035.vdocuments.mx/reader035/viewer/2022062701/5542eb66497959361e8d2661/html5/thumbnails/30.jpg)
Cammini minimi in DAG: esempio
5 2 7 -1 -2
6 1
3 42
0 2 6 5 3
![Page 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,](https://reader035.vdocuments.mx/reader035/viewer/2022062701/5542eb66497959361e8d2661/html5/thumbnails/31.jpg)
Cammini minimi in DAG: complessità
T(V,E) = (V + E) + (V) + E (1) = (V + E)