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