Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Paolo Camurati
Dip. Automatica e Informatica
Politecnico di Torino
Cammini minimi
G=(V,E) grafo orientato, pesato (w: ER).
Definizioni:
peso w(p) di un cammino p:
w(p) = i=1kw(vi-1, vi)
peso d(s,v) di un cammino minimo da s a v:
min{w(p): se s p v }
d(s,v) =
altrimenti
Cammino minimo da s a v:
qualsiasi cammino p con w(p) = d(s,v)
A.A. 2019/20 19 I cammini minimi 2
Problemi classici
Cammini minimi:
da sorgente singola: cammino minimo e
suo peso da s a ogni altro vertice v
algoritmo di Dijkstra
algoritmo di Bellman-Ford
-4
a b
4
3 6
5 8
s c d g
2 -3
7
3
e f
-6
Costo esponenziale.
s radice dell’albero
6
u v
1 2 4 7 2
s
5
3
6
x y
3
0
1 2 4 7 2
s
5
3
5 11
6
x y
5 9 d[v] =9
d[u] = 5
2 w(u,v) = 2
u v
d[v] > d[u] + w(u,v)
Relax
d[v] = 7
5 7
st[v] = u
2 cammino minimo da s
u v av=
cammino minimo da s
a u + arco (u,v)
A.A. 2019/20 19 I cammini minimi 19
5 6 d[v] =6
d[u] = 5
2 w(u,v) = 2
u v
d[v] < d[u] + w(u,v)
Relax
5 6 Il rilassamento non ha
avuto effetto.
2
u v
(u,v)E
d(s,v) d(s,u) + w(u,v)
Un cammino minimo da s a v non può avere
peso maggiore del cammino formato da un
cammino minimo da s a u e da un arco (u, v).
vV
d(v) d(s,v)
Una volta che il limite superiore d(v) assume
il valore d(s,v) esso non cambia più.
arco e = (u,v)
Rilassamento:
applicato 1 volta ad ogni arco (Dijkstra) o
più volte (Bellman-Ford)
ordine con cui si rilassano gli archi.
1 ST
u v 0 s
10
1 u
9 2 x
s 3 2 6 4
3 v
5 4 y
7
2
x y
5
7
2
x y
A.A. 2019/20 19 I cammini minimi 30
S={s}
relax (s,u), (s,x)
PQ={x/5, u/10,v/, y/}
10
1 st 0 0 0 -1 -1
u v
10 0 1 2 3 4
0 d 0 10 5
3 2 9 6
s 4 0 1 2 3 4
5
7
2
x y
5
A.A. 2019/20 19 I cammini minimi 31
S={s, x}
relax (x,u), (x,v), (x,y)
PQ={y/7, u/8,v/14}
8 14
1 st 0 2 0 2 2
u v
10 0 1 2 3 4
0 d 0 8 5 14 7
3 2 9 6
s 4 0 1 2 3 4
5
7
2
x y
5 7
A.A. 2019/20 19 I cammini minimi 32
S={s, x, y}
relax (y,s), (y,v)
PQ={u/8,v/13}
8 13
1 st 0 2 0 4 2
u v
10 0 1 2 3 4
0 d 0 8 5 13 7
3 2 9 6
s 4 0 1 2 3 4
5
7
2
x y
5 7
A.A. 2019/20 19 I cammini minimi 33
S={s, x, y, u}
relax (u,v), (u,x)
PQ={v/9}
8 9
1 st 0 2 0 1 2
u v
10 0 1 2 3 4
0 d 0 8 5 9 7
3 2 9 6
s 4 0 1 2 3 4
5
7
2
x y
5 7
A.A. 2019/20 19 I cammini minimi 34
S={s, x, y, u, v}
relax (v,y)
PQ={}
8 9
1 st 0 2 0 1 2
u v
10 0 1 2 3 4
0 d 0 8 5 9 7
3 2 9 6
s 4 0 1 2 3 4
5
7
2
x y
5 7
A.A. 2019/20 19 I cammini minimi 35
S={s, x, y, u, v}
PQ={}
8 9
1 st 0 2 0 1 2
u v
10 0 1 2 3 4
0 d 0 8 5 9 7
3 2 9 6
s 4 0 1 2 3 4
5
7
2
x y
5 7
A.A. 2019/20 19 I cammini minimi 36
void GRAPHspD(Graph G, int id) {
int v;
link t;
PQ con priorità in d
PQ pq = PQinit(G->V);
int *st, *d;
st = malloc(G->V*sizeof(int));
d = malloc(G->V*sizeof(int));
d[id] = 0;
st[id] = id;
PQchange(pq, d, id);
inserisce u in S O(lg|V|)
rilassa tutti gli archi uscenti da u.
O(|E|)
T(n) = O((|V|+|E|) lg |V|)
T(n) = O(|E| lg |V|) se tutti i vertici sono
raggiungibili da s
A.A. 2019/20 19 I cammini minimi 39
Dijkstra e grafi con pesi negativi
archi a peso negativo
ciclo a peso negativo
ST
5
u -2
v 0 z
0 6 1 u
-4 -3
2 x
z 8 7
3 v
7
2 4 y
x 9 y
A.A. 2019/20 19 I cammini minimi 40
Dijkstra e grafi con pesi negativi
archi a peso negativo
ciclo a peso negativo S={}
PQ={z/0, u/, v/, x/, y/}
5
u -2
v st 0 -1 -1 -1 -1
0 6 0 1 2 3 4
-4 -3
d 0
z 8 7
7
0 1 2 3 4
2
Coda a priorità visualizzata per
x 9 y semplicità come vettore.
I nodi compaiono con il loro
nome originale per leggibilità
A.A. 2019/20 19 I cammini minimi 41
S={z}
6 relax (z,u), (z,x)
5 PQ={u/6, x/7, v/, y/}
u -2
v
0 6 st 0 0 0 -1 -1
-4 -3 0 1 2 3 4
z 8 7
d 0 6 7
7
2 0 1 2 3 4
x 9 y
7
A.A. 2019/20 19 I cammini minimi 42
S={z, u}
6 11 relax (u,v), (u,x), (u,y)
5 PQ={y/2, x/7, v/11}
u -2
v
0 6 st 0 0 0 1 1
-4 -3 0 1 2 3 4
z 8 7
d 0 6 7 11 2
7
2 0 1 2 3 4
x 9 y
7 2
A.A. 2019/20 19 I cammini minimi 43
S={z, u, y}
6 9 relax (y,z), (y,v)
5 PQ={x/7, v/9}
u -2
v
0 6 st 0 0 0 4 1
-4 -3 0 1 2 3 4
z 8 7
d 0 6 7 9 2
7
2 0 1 2 3 4
x 9 y
7 2
A.A. 2019/20 19 I cammini minimi 44
S={z, u, y, x}
6 4 relax (x,v), (x,y)
5 PQ={v/4}
u -2
v
0 6 st 0 0 0 2 1
-4 -3 0 1 2 3 4
z 8 7
d 0 6 7 4 2
7
2 0 1 2 3 4
x 9 y
7 2
A.A. 2019/20 19 I cammini minimi 45
S={z, u, x, y, v}
2 4 relax (v,u)
5 PQ={}
u -2
v
0 6 st 0 3 0 2 1
-4 -3 0 1 2 3 4
z 8 7
d 0 2 7 4 2
7
2 0 1 2 3 4
x 9 y
7 2
A.A. 2019/20 19 I cammini minimi 46
Soluzione non
ottima!
S={z, u, x, y, v}
2 4 relax (v,u)
5 PQ={}
u -2
v
0 6 st 0 3 0 2 1
-4 -3 0 1 2 3 4
z 8 7
d 0 2 7 4 2
7
2 0 1 2 3 4
x 9 y Se si riconsiderasse l’arco
7 2 (1,4) la stima di y scenderebbe
a -2 (Soluzione ottima).
A.A. 2019/20 19 I cammini minimi 47
Cammini minimi su DAG pesati
u Ordine di applicazione
v
2
6 della relaxation
3 (z, u)
z 8 5 (z, x)
(z, y)
7 2 (u, v)
9 (u, x)
x y
(x, v)
(x, y)
ordinamento topologico
(y, v)
z u x y v
ordinamento topologico
z u x y v
7 2
9
2 4
-∞ -∞
ordinamento topologico
0 1 2 4 3
7 2
9
2 4
7 2
0 1 2 4 3
7 2
9
2 4
14 2
0 1 2 4 3
7 2
9
2 4
14 23
0 1 2 4 3
7 2
9
2 4
14 23
0 1 2 4 3
7 2
9
2 4
14 23
0 1 2 4 3
ST Archi in ordine
lessicografico:
0 z
(u,v)
5 1 u (u,x)
u -2
v 2 x (u,y)
6 3 v (v,u)
-4 -3
4 y (x,v)
z 8 7 (x,y)
7 (y,v)
2
(y,z)
x 9 y (z,u)
(z,x)
5 Passo 1
u v (u,v)
-2
(u,x)
6
(u,y)
0 -4 -3 (v,u)
z 8 7 (x,v)
(x,y)
7 (y,v)
2
(y,z)
9 (z,u)
x y (z,x)
Inizializzazione O(|V||E|)
|V|-1 passi di rilassamento sugli archi
|V|esimo rilassamento
st = malloc(G->V*sizeof(int));
mindist = malloc(G->V*sizeof(int));
mindist[id] = 0;
st[id] = id;
0.966 0.843
0.655
1.247
0.678
CHF GBP
1.474
A.A. 2019/20 19 I cammini minimi 121
1000 USD = 777 EUR = 655,11 GBP = 1006,10 USD
Guadagno di 6,10 USD arbitrage
Sul ciclo
USD – EUR – GBP – USD
il prodotto dei tassi di cambio è
0.777 * 0.843 * 1.536 = 1,0061 > 1.0
c’è arbitrage quando ciclo a peso > 1
+0.034
+0.423 +0.170
-0.220
+0.388
CHF GBP
-0.388
A.A. 2019/20 19 I cammini minimi 124
Riferimenti
Principi:
Sedgewick Part 5 21.1
Cormen 24.1
Algoritmo di Dijkstra:
Sedgewick Part 5 21.2
Cormen 24.4
Cammini minimi e massimi in DAG:
Sedgewick Part 5 21.4
Cormen 24.3
Algoritmo di Bellman-Ford:
Sedgewick Part 5 21.7
A.A. 2019/20 Cormen 24.2 19 I cammini minimi 125
Esercizi di teoria
12. Visite dei grafi e applicazioni
• 12.1 Algoritmo di Dijkstra
• 12.2 Algoritmo per i DAG pesati
• 12.3 Algoritmo di Bellman-Ford