Alberi di copertura
Transcript
Alberi di copertura
Alberi di copertura Mauro Passacantando Dipartimento di Informatica Largo B. Pontecorvo 3, Pisa [email protected] M. Passacantando TFA 2012/13 - Corso di Ricerca Operativa Università di Pisa 1/9 Definizioni Albero In un grafo (N, A) non orientato e connesso, un albero è un insieme di archi connesso e privo di cicli. Albero di copertura In un grafo (N, A) non orientato e connesso, un albero di copertura è un albero che connette tutti i nodi del grafo. Esercizio Quanti archi ha un albero di copertura? Perché? M. Passacantando TFA 2012/13 - Corso di Ricerca Operativa Università di Pisa 2/9 Albero di copertura di costo minimo Problema Dato un grafo (N, A) non orientato e connesso, trovare un albero di copertura di costo minimo. Algoritmo di Kruskal 1. Disponi gli archi a1 , . . . , am in ordine crescente di costo. T := ∅, j := 1. 2. se T ∪ {aj } non contiene un ciclo allora inserisci aj in T 3. se |T | = n − 1 allora STOP altrimenti j := j + 1 e torna al passo 2 vedi anche: http://www.cut-the-knot.org/Curriculum/Combinatorics/MinimumSpanningTree.shtml M. Passacantando TFA 2012/13 - Corso di Ricerca Operativa Università di Pisa 3/9 Correttezza dell’algoritmo di Kruskal Teorema L’algoritmo di Kruskal trova un albero di copertura di costo minimo. Dimostrazione T è un albero (perché non contiene cicli) di copertura (perché ha n − 1 archi). Per dimostrare che T è ottimo, dimostriamo che per ogni k = 0, . . . , n − 1 vale questa proprietà: durante l’esecuzione dell’algoritmo, se T ha k archi allora esiste un albero ottimo T ′ che contiene T . (P) Dimostrazione per induzione su k. Per k = 0 (P) è ovviamente vera. Supponiamo che (P) sia vera per un certo k < n − 1 e dimostriamo che (P) è vera anche per k + 1. Supponiamo che il prossimo arco che viene inserito in T sia {i, j}. Se {i, j} ∈ T ′ , allora T ′ contiene T ∪ {i, j}, quindi (P) è vera anche per k + 1. M. Passacantando TFA 2012/13 - Corso di Ricerca Operativa Università di Pisa 4/9 Correttezza dell’algoritmo di Kruskal Dimostrazione (segue) Se {i, j} ∈ / T ′ , allora T ′ ∪ {i, j} contiene un ciclo C . In C esiste un arco {p, q} ∈ / T. Dimostriamo ora che cpq ≥ cij . Infatti, se cpq < cij e {i, j} è il prossimo arco che viene inserito in T , allora l’arco {p, q} dovrebbe formare un ciclo con gli archi di T , ma T ⊂ T ′ e quindi {p, q} ∈ T ′ formerebbe un ciclo con gli archi di T ′ , che è impossibile perché T ′ è un albero. L’insieme T ′′ = T ′ \ {p, q} ∪ {i, j} è un albero di copertura e costo(T ′′ ) = costo(T ′ ) − cpq + cij ≤ costo(T ′ ), quindi T ′′ è ottimo e contiene T ∪ {i, j}, quindi (P) è vera anche per k + 1. T′ T ′′ p i p i j q j C q T M. Passacantando T TFA 2012/13 - Corso di Ricerca Operativa Università di Pisa 5/9 Implementazione dell’algoritmo di Kruskal Per controllare l’esistenza di un ciclo usiamo delle etichette d sui nodi in modo che: • i nodi di una componente connessa di T abbiano la stessa etichetta • i nodi di due componenti connesse diverse di T abbiano etichette diverse Algoritmo di Kruskal 1. Disponi gli archi a1 , . . . , am in ordine crescente di costo. T := ∅, j := 1, di := i per ogni i = 1, . . . , n 2. Sia aj = {p, q} con dp ≤ dq . se dp < dq allora T := T ∪ {aj } per ogni i = 1, . . . , n: se di = dq allora di := dp 3. se |T | = n − 1 allora STOP altrimenti j := j + 1 e torna al passo 2 M. Passacantando TFA 2012/13 - Corso di Ricerca Operativa Università di Pisa 6/9 Algoritmo di Kruskal: esempio 1 9 3 6 6 8 2 4 3 3 7 1 1 5 {1, 2} 3 {1, 3} 6 M. Passacantando 4 2 {1, 6} 9 {2, 3} 4 {2, 4} 3 TFA 2012/13 - {3, 4} 1 {3, 5} 1 Corso di Ricerca Operativa {3, 6} 8 {4, 5} 2 Università di Pisa {5, 6} 7 7/9 Algoritmo di Kruskal: esempio 1 1 6 6 2 2 3 3 5 {3, 4} 1 {3, 5} 1 M. Passacantando 5 4 4 {4, 5} 2 {1, 2} 3 {2, 4} 3 TFA 2012/13 - {2, 3} 4 {1, 3} 6 Corso di Ricerca Operativa {5, 6} 7 {3, 6} 8 Università di Pisa {1, 6} 9 7/9 Algoritmo di Kruskal: esempio 1 1 6 6 2 2 3 3 5 {3, 4} 1 {3, 5} 1 M. Passacantando 5 {4, 5} 2 4 4 {1, 2} 3 {2, 4} 3 TFA 2012/13 - {2, 3} 4 {1, 3} 6 Corso di Ricerca Operativa {5, 6} 7 {3, 6} 8 Università di Pisa {1, 6} 9 7/9 Algoritmo di Kruskal: esempio 1 1 6 6 2 2 3 3 5 {3, 4} 1 {3, 5} 1 M. Passacantando 5 4 3 {4, 5} 2 {1, 2} 3 {2, 4} 3 TFA 2012/13 - {2, 3} 4 {1, 3} 6 Corso di Ricerca Operativa {5, 6} 7 {3, 6} 8 Università di Pisa {1, 6} 9 7/9 Algoritmo di Kruskal: esempio 1 1 6 6 2 2 3 3 5 {3, 4} 1 {3, 5} 1 M. Passacantando 5 4 3 {4, 5} 2 {1, 2} 3 {2, 4} 3 TFA 2012/13 - {2, 3} 4 {1, 3} 6 Corso di Ricerca Operativa {5, 6} 7 {3, 6} 8 Università di Pisa {1, 6} 9 7/9 Algoritmo di Kruskal: esempio 1 1 6 6 2 2 3 3 3 {3, 4} 1 {3, 5} 1 M. Passacantando 5 4 3 {4, 5} 2 {1, 2} 3 {2, 4} 3 TFA 2012/13 - {2, 3} 4 {1, 3} 6 Corso di Ricerca Operativa {5, 6} 7 {3, 6} 8 Università di Pisa {1, 6} 9 7/9 Algoritmo di Kruskal: esempio 1 1 6 6 2 2 3 3 3 {3, 4} 1 {3, 5} 1 M. Passacantando 5 {4, 5} 2 4 3 {1, 2} 3 {2, 4} 3 TFA 2012/13 - {2, 3} 4 {1, 3} 6 Corso di Ricerca Operativa {5, 6} 7 {3, 6} 8 Università di Pisa {1, 6} 9 7/9 Algoritmo di Kruskal: esempio 1 1 6 6 2 2 3 3 3 {3, 4} 1 {3, 5} 1 M. Passacantando 5 4 3 {4, 5} 2 {1, 2} 3 {2, 4} 3 TFA 2012/13 - {2, 3} 4 {1, 3} 6 Corso di Ricerca Operativa {5, 6} 7 {3, 6} 8 Università di Pisa {1, 6} 9 7/9 Algoritmo di Kruskal: esempio 1 1 6 6 2 2 3 3 3 {3, 4} 1 {3, 5} 1 M. Passacantando 5 {4, 5} 2 4 3 {1, 2} 3 {2, 4} 3 TFA 2012/13 - {2, 3} 4 {1, 3} 6 Corso di Ricerca Operativa {5, 6} 7 {3, 6} 8 Università di Pisa {1, 6} 9 7/9 Algoritmo di Kruskal: esempio 1 1 6 6 2 1 3 3 3 {3, 4} 1 {3, 5} 1 M. Passacantando 5 {4, 5} 2 4 3 {1, 2} 3 {2, 4} 3 TFA 2012/13 - {2, 3} 4 {1, 3} 6 Corso di Ricerca Operativa {5, 6} 7 {3, 6} 8 Università di Pisa {1, 6} 9 7/9 Algoritmo di Kruskal: esempio 1 1 6 6 2 1 3 3 3 {3, 4} 1 {3, 5} 1 M. Passacantando 5 {4, 5} 2 4 3 {1, 2} 3 {2, 4} 3 TFA 2012/13 - {2, 3} 4 {1, 3} 6 Corso di Ricerca Operativa {5, 6} 7 {3, 6} 8 Università di Pisa {1, 6} 9 7/9 Algoritmo di Kruskal: esempio 1 1 6 6 2 1 3 1 1 {3, 4} 1 {3, 5} 1 M. Passacantando 5 {4, 5} 2 4 1 {1, 2} 3 {2, 4} 3 TFA 2012/13 - {2, 3} 4 {1, 3} 6 Corso di Ricerca Operativa {5, 6} 7 {3, 6} 8 Università di Pisa {1, 6} 9 7/9 Algoritmo di Kruskal: esempio 1 1 6 6 2 1 3 1 1 {3, 4} 1 {3, 5} 1 M. Passacantando 5 {4, 5} 2 4 1 {1, 2} 3 {2, 4} 3 TFA 2012/13 - {2, 3} 4 {1, 3} 6 Corso di Ricerca Operativa {5, 6} 7 {3, 6} 8 Università di Pisa {1, 6} 9 7/9 Algoritmo di Kruskal: esempio 1 1 6 6 2 1 3 1 1 {3, 4} 1 {3, 5} 1 M. Passacantando 5 {4, 5} 2 4 1 {1, 2} 3 {2, 4} 3 TFA 2012/13 - {2, 3} 4 {1, 3} 6 Corso di Ricerca Operativa {5, 6} 7 {3, 6} 8 Università di Pisa {1, 6} 9 7/9 Algoritmo di Kruskal: esempio 1 1 6 6 2 1 3 1 1 {3, 4} 1 {3, 5} 1 M. Passacantando 5 {4, 5} 2 4 1 {1, 2} 3 {2, 4} 3 TFA 2012/13 - {2, 3} 4 {1, 3} 6 Corso di Ricerca Operativa {5, 6} 7 {3, 6} 8 Università di Pisa {1, 6} 9 7/9 Algoritmo di Kruskal: esempio 1 1 6 6 2 1 3 1 1 {3, 4} 1 {3, 5} 1 M. Passacantando 5 {4, 5} 2 4 1 {1, 2} 3 {2, 4} 3 TFA 2012/13 - {2, 3} 4 {1, 3} 6 Corso di Ricerca Operativa {5, 6} 7 {3, 6} 8 Università di Pisa {1, 6} 9 7/9 Algoritmo di Kruskal: esempio 1 1 6 6 2 1 3 1 1 {3, 4} 1 {3, 5} 1 M. Passacantando 5 {4, 5} 2 4 1 {1, 2} 3 {2, 4} 3 TFA 2012/13 - {2, 3} 4 {1, 3} 6 Corso di Ricerca Operativa {5, 6} 7 {3, 6} 8 Università di Pisa {1, 6} 9 7/9 Algoritmo di Kruskal: esempio 1 1 1 6 2 1 3 1 1 {3, 4} 1 {3, 5} 1 M. Passacantando 5 {4, 5} 2 4 1 {1, 2} 3 {2, 4} 3 TFA 2012/13 - {2, 3} 4 {1, 3} 6 Corso di Ricerca Operativa {5, 6} 7 {3, 6} 8 Università di Pisa {1, 6} 9 7/9 Algoritmo di Prim Soluzione alternativa: costruisco l’albero mantenendo una sola componente connessa C . Ad ogni iterazione aggiungo l’arco di costo minimo che collega C ai nodi non ancora connessi. 1. Scegli un nodo k. Poni C = {k} e T = ∅. 2. se C = N allora STOP 3. Calcola min i ∈C , j ∈C / cij = cpq , inserisci l’arco (p, q) in T , inserisci il nodo q in C e torna al passo 2. M. Passacantando TFA 2012/13 - Corso di Ricerca Operativa Università di Pisa 8/9 Implementazione dell’algoritmo di Prim Per trovare il prossimo nodo da aggiungere a C e il prossimo arco da aggiungere a T , utilizzo per ogni nodo i due etichette di e pi : - di è il minimo costo per collegare i a C - pi è il predecessore di i, serve per memorizzare qual è il modo migliore per collegare i a C . 1. Scegli un nodo k. Poni C = {k}, T = ∅, dk = 0, di = ∞ per ogni i 6= k, pi = −1 per ogni i. 2. se C = N allora STOP 3. Chiama u l’ultimo nodo inserito in C . Per ogni arco (u, j) con j ∈ / C: se dj > cuj allora poni dj := cuj e pj = u 4. Calcola min dj = dq , j ∈C / inserisci il nodo q in C, inserisci l’arco (pq , q) in T e torna al passo 2. vedi anche: http://weierstrass.is.tokushima-u.ac.jp/ikeda/suuri/dijkstra/PrimApp.shtml?demo3 M. Passacantando TFA 2012/13 - Corso di Ricerca Operativa Università di Pisa 9/9