• Non ci sono risultati.

Alberi di copertura

N/A
N/A
Protected

Academic year: 2022

Condividi "Alberi di copertura"

Copied!
26
0
0

Testo completo

(1)

Mauro Passacantando Dipartimento di Informatica Largo B. Pontecorvo 3, Pisa [email protected]

(2)

Definizioni

Albero

In un grafo (N, A) non orientato e connesso, unalbero`e un insieme di archi connesso e privo di cicli.

Albero di copertura

In un grafo (N, A) non orientato e connesso, unalbero di copertura`e un albero che connette tutti i nodi del grafo.

Esercizio

Quanti archi ha un albero di copertura? Perch´e?

(3)

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

(4)

Correttezza dell’algoritmo di Kruskal

Teorema

L’algoritmo di Kruskal trova un albero di copertura di costo minimo.

Dimostrazione

T `e un albero (perch´e non contiene cicli) di copertura (perch´e ha n − 1 archi).

Per dimostrare che T `e ottimo, dimostriamo che per ogni k = 0, . . . , n − 1 vale questa propriet`a:

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) `e ovviamente vera.

Supponiamo che (P) sia vera per un certo k < n − 1 e dimostriamo che (P) `e 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) `e vera anche per k + 1.

(5)

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} `e il prossimo arco che viene inserito in T , allora l’arco {p, q} dovrebbe formare un ciclo con gli archi di T , ma T ⊂ Te quindi {p, q} ∈ T formerebbe un ciclo con gli archi di T, che `e impossibile perch´e T`e un albero.

L’insieme T′′= T\ {p, q} ∪ {i, j} `e un albero di copertura e costo(T′′) = costo(T) − cpq+ cij ≤ costo(T), quindi T′′`e ottimo e contiene T ∪ {i, j}, quindi (P) `e vera anche per k + 1.

q j

p i

T

C

q j

p i

T′′

(6)

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

(7)

1

2

3

4 5

6

3 6

9

4

3 1

1 8

2 7

{1, 2} {1, 3} {1, 6} {2, 3} {2, 4} {3, 4} {3, 5} {3, 6} {4, 5} {5, 6}

3 6 9 4 3 1 1 8 2 7

(8)

Algoritmo di Kruskal: esempio

1

2

3

4 5

6

1

2

3

4 5

6

{3, 4} {3, 5} {4, 5} {1, 2} {2, 4} {2, 3} {1, 3} {5, 6} {3, 6} {1, 6}

1 1 2 3 3 4 6 7 8 9

(9)

1

2

3

4 5

6

1

2

3

4 5

6

{3, 4} {3, 5} {4, 5} {1, 2} {2, 4} {2, 3} {1, 3} {5, 6} {3, 6} {1, 6}

1 1 2 3 3 4 6 7 8 9

(10)

Algoritmo di Kruskal: esempio

1

2

3

4 5

6

1

2

3

3 5

6

{3, 4} {3, 5} {4, 5} {1, 2} {2, 4} {2, 3} {1, 3} {5, 6} {3, 6} {1, 6}

1 1 2 3 3 4 6 7 8 9

(11)

1

2

3

4 5

6

1

2

3

3 5

6

{3, 4} {3, 5} {4, 5} {1, 2} {2, 4} {2, 3} {1, 3} {5, 6} {3, 6} {1, 6}

1 1 2 3 3 4 6 7 8 9

(12)

Algoritmo di Kruskal: esempio

1

2

3

4 5

6

1

2

3

3 3

6

{3, 4} {3, 5} {4, 5} {1, 2} {2, 4} {2, 3} {1, 3} {5, 6} {3, 6} {1, 6}

1 1 2 3 3 4 6 7 8 9

(13)

1

2

3

4 5

6

1

2

3

3 3

6

{3, 4} {3, 5} {4, 5} {1, 2} {2, 4} {2, 3} {1, 3} {5, 6} {3, 6} {1, 6}

1 1 2 3 3 4 6 7 8 9

(14)

Algoritmo di Kruskal: esempio

1

2

3

4 5

6

1

2

3

3 3

6

{3, 4} {3, 5} {4, 5} {1, 2} {2, 4} {2, 3} {1, 3} {5, 6} {3, 6} {1, 6}

1 1 2 3 3 4 6 7 8 9

(15)

1

2

3

4 5

6

1

2

3

3 3

6

{3, 4} {3, 5} {4, 5} {1, 2} {2, 4} {2, 3} {1, 3} {5, 6} {3, 6} {1, 6}

1 1 2 3 3 4 6 7 8 9

(16)

Algoritmo di Kruskal: esempio

1

2

3

4 5

6

1

1

3

3 3

6

{3, 4} {3, 5} {4, 5} {1, 2} {2, 4} {2, 3} {1, 3} {5, 6} {3, 6} {1, 6}

1 1 2 3 3 4 6 7 8 9

(17)

1

2

3

4 5

6

1

1

3

3 3

6

{3, 4} {3, 5} {4, 5} {1, 2} {2, 4} {2, 3} {1, 3} {5, 6} {3, 6} {1, 6}

1 1 2 3 3 4 6 7 8 9

(18)

Algoritmo di Kruskal: esempio

1

2

3

4 5

6

1

1

1

1 1

6

{3, 4} {3, 5} {4, 5} {1, 2} {2, 4} {2, 3} {1, 3} {5, 6} {3, 6} {1, 6}

1 1 2 3 3 4 6 7 8 9

(19)

1

2

3

4 5

6

1

1

1

1 1

6

{3, 4} {3, 5} {4, 5} {1, 2} {2, 4} {2, 3} {1, 3} {5, 6} {3, 6} {1, 6}

1 1 2 3 3 4 6 7 8 9

(20)

Algoritmo di Kruskal: esempio

1

2

3

4 5

6

1

1

1

1 1

6

{3, 4} {3, 5} {4, 5} {1, 2} {2, 4} {2, 3} {1, 3} {5, 6} {3, 6} {1, 6}

1 1 2 3 3 4 6 7 8 9

(21)

1

2

3

4 5

6

1

1

1

1 1

6

{3, 4} {3, 5} {4, 5} {1, 2} {2, 4} {2, 3} {1, 3} {5, 6} {3, 6} {1, 6}

1 1 2 3 3 4 6 7 8 9

(22)

Algoritmo di Kruskal: esempio

1

2

3

4 5

6

1

1

1

1 1

6

{3, 4} {3, 5} {4, 5} {1, 2} {2, 4} {2, 3} {1, 3} {5, 6} {3, 6} {1, 6}

1 1 2 3 3 4 6 7 8 9

(23)

1

2

3

4 5

6

1

1

1

1 1

6

{3, 4} {3, 5} {4, 5} {1, 2} {2, 4} {2, 3} {1, 3} {5, 6} {3, 6} {1, 6}

1 1 2 3 3 4 6 7 8 9

(24)

Algoritmo di Kruskal: esempio

1

2

3

4 5

6

1

1

1

1 1

1

{3, 4} {3, 5} {4, 5} {1, 2} {2, 4} {2, 3} {1, 3} {5, 6} {3, 6} {1, 6}

1 1 2 3 3 4 6 7 8 9

(25)

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

i ∈C, j /minCcij= cpq,

inserisci l’arco (p, q) in T , inserisci il nodo q in C e torna al passo 2.

(26)

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 `e il minimo costo per collegare i a C

- pi `e il predecessore di i, serve per memorizzare qual `e 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

minj/Cdj = dq,

inserisci il nodo q in C, inserisci l’arco (pq, q) in T e torna al passo 2.

vedi anche:

Riferimenti

Documenti correlati

liste di adiacenza: una lista di tutti i nodi e, per ciascuno di essi, una lista dei nodi

Un arco che attraversa un taglio si dice leggero se ha peso pari al minimo tra i pesi di tutti gli archi che attraversano tale taglio..

Soluzione : dalle matrici di adiacenza si vede che il vertice corrispondente alla settima colonna (o riga) in G’ ha grado 4, mentre G non ha vertici di grado 4. Ciò implica che G e

3) Scrivere un algoritmo di verifica per il problema di decidere se un grafo di n vertici, rappresentato con una matrice binaria M, contiene una clique di k

Per ogni copertura almeno uno dei due nodi accoppiati deve appartenere alla copertura, altrimenti l’arco non sarebbe coperto, da cui la diseguaglianza cercata.. Il pi` u

Applicando il metodo di Fourier-Motzkin dire se il seguente sistema lineare ammette un’unica soluzione ovvero ammette infinite soluzioni ovvero non ammette

[r]

Date 2 matrici booleane M,N tali che M sia una matrice nxm ed N sia una matrice mxt, definiamo prodotto booleano MxN la matrice booleana ottenuta calcolando il prodotto righe