• Non ci sono risultati.

Grafi: visita in ampiezza

N/A
N/A
Protected

Academic year: 2022

Condividi "Grafi: visita in ampiezza "

Copied!
22
0
0

Testo completo

(1)

Grafi: visita in ampiezza

Una presentazione alternativa (con ulteriori dettagli)

………..

(2)

VISITA (G, s)

color [s] ← gray

while ci sono vertici grigi do u ← un vertice grigio

{if u non visitato then visitalo}

if c’è v bianco ∈ ADJ [u]

then color [v] ← gray π[v] ← u

Consideriamo la versione “concreta” dell’algoritmo di visita generica con costruzione del sottografo dei predecessori:

D ← make_empty add (D, s)

first (D)

not empty(D)

(3)

La struttura dati D è una

CODA

(4)

A

B

C

D

E

F

G

H

Q A B D

A

B D

Esempio (1/9)

(5)

Q A

B

C

D

E

F

G

H

B D C F

A

B D

C F

Esempio (2/9)

(6)

Q A

B

C

D

E

F

G

H

D C F H

A

B D

C F H

Esempio (3/9)

(7)

Q A

B

C

D

E

F

G

H

C F H E

A

B D

C F H

A

B D

C F

E

Esempio (4/9)

(8)

Q A

B

C

D

E

F

G

H

F H E G

A

B D

C F H

A

B D

C F

E G

Esempio (5/9)

(9)

Q A

B

C

D

E

F

G

H H E G

A

B D

C F H

A

B D

C F

E G

Esempio (6/9)

(10)

Q A

B

C

D

E

F

G

H E G

A

B D

C F H

A

B D

C F

E G

Esempio (7/9)

(11)

Q A

B

C

D

E

F

G

H G

A

B D

C F H

A

B D

C F

E G

Esempio (8/9)

(12)

Q A

B

C

D

E

F

G

H

A

B D

C F H

A

B D

C F

E G

Esempio (9/9)

(13)

BFS-VISITA (G, s)

Q ← make_empty_queue color [s] ← gray

enqueue (Q, s)

while not_empty (Q) do u ← head (Q)

{if u non visitato then visitalo}

if c’è v bianco ∈ ADJ [u]

then color [v] ← gray π[v] ← u

enqueue (Q, v) else color [u] ← black

{visita u}

for ogni v ∈ ADJ [u] do if color [v] = white

then color [v] ← gray π[v] ← u

enqueue (Q, v) Poichè la head della coda non cambia finché ci sono adiacenti bianchi, l'algoritmo può essere modificato nel modo seguente:

Due versioni dell’algoritmo di visita in ampiezza

(14)

BFS-VISITA (G, s)

Q ← make_empty_queue color [s] ← gray

enqueue (Q, s)

while not_empty (Q) do u ← head (Q)

{visita u}

for ogni v ∈ ADJ [u] do if color [v] = white

then color [v] ← gray π[v] ← u

Ptr ← ADJ [u]

while Ptr ≠ nil do

if color [Ptr.vtx] = white

then color [Ptr.vtx] ← gray π[Ptr.vtx] ← u

Una terza versione “ancora più concreta” dell’algoritmo

(15)

N.B. Nella visita in ampiezza Breadth First Search l’albero viene costruito a livelli

A

B D

C F H

E G

Modifichiamo la (2a versione del)l’algoritmo per “sintetizzare” altre informazioni

(16)

BFS-VISITA (G, s)

Q ← make_empty_queue color [s] ← gray

d[s] ← 0

enqueue (Q, s)

while not_empty (Q) do u ← head (Q)

{visita u}

for ogni v ∈ ADJ [u] do if color [v] = white

then color [v] ← gray π[v] ← u

d[v] ← d[u] + 1

Bisogna inizializzare l’attributo d INIZIALIZZA (G)

for ogni u ∈ V do color [u] ← white π[u] ← nil

d[u] ← ∞

(17)

B

D

F

A C E G

H

Vertici memorizzati nelle liste di adiacenza in ordine alfabetico

Vertici memorizzati nelle liste di adiacenza in ordine inverso

D

A B B

A

D

Riprendiamo l’esempio (1/2)

(18)

Teorema

B

C E

A

H G

F

D

H

E

A

B C

G

D

F G

Proprietà della visita in ampiezza (1/4)

(19)

Proprietà

1. In Q ci sono tutti e soli i vertici grigi

2. Se <v1, v2, . . . , vn> è il contenuto di Q, allora:

d[vn] ≤ d[v1] + 1

d[vi] ≤ d[vi+1] 1 ≤ i ≤ n-1 Lemma

La seguente proprietà è un invariante dei due while di BFS-VISITA:

(INV4) d[v] = δ(s,v) per tutti i vertici v grigi o neri.

Dimostrazione

Proprietà della visita in ampiezza (2/4)

(20)

Consideriamo in G un cammino minimo da s a v.

Per l’invariante INV3 tale cammino contiene almeno un vertice t grigio. Il cammino minimo può allora essere visto

come concatenazione dei due cammini minimi da s a t e da t a v.

δ(s,v) = δ(s,t) + δ(t,v) ≥ δ(s,t) + 1 (δ(t,v) ≥ 1 poichè t ≠ v).

Ma il vertice t è in Q (t è grigio) e per l’invariante INV4, essendo u = head(Q): d[u] ≤ d[t] = δ(s,t).

Si ottiene pertanto: δ(s,v) ≥ δ(s,t) + 1 = d[t] + 1 ≥ d[u] + 1.

Poichè s u → v è un cammino in G da s a v, esso non può

Proprietà della visita in ampiezza (3/4)

(21)

Teorema.

Al termine dell'esecuzione di BFS si ha d[v] = δ(s,v) per tutti i vertici v ∈ V.

Dimostrazione.

Se v non è raggiungible da s allora d[v] rimane ∞ = δ(s,v).

Altrimenti v è nero e il teorema vale per il Lemma precedente.

• per ogni vertice v raggiungibile da s, il cammino da s a v sull’albero ottenuto con la visita è un cammino minimo.

Proprietà della visita in ampiezza (4/4)

(22)

Esercizio

• La correttezza della seconda (e della terza) versione dell’algoritmo di visita in ampiezza segue dalla

correttezza della prima versione dell’algoritmo (che, a sua volta, è conseguenza immediata della correttezza

dell’algoritmo di visita generica, che stata dimostrata con il metodo delle asserzioni). ANNOTATE (SCRIVENDO SULLA STAMPA DEI LUCIDI) IL CODICE DELLA PRIMA, DELLA SECONDA, E DELLA TERZA

VERSIONE DELL’ALGORITMO CON LE

Riferimenti

Documenti correlati

● L'uso di asserzioni e invarianti è uno strumento molto potente per dimostrare la correttezza di programmi. ● Ha però

– Deve essere vera la prima volta che il ciclo

Acuto, ottuso, retto, concavo, piatto ti ricordi ancora cosa indicano queste parole a proposito dell’ampiezza degli angoli. Prova a disegnare un rappresentante di ognuna di

questa perturbazione può essere sempre rappresentata come serie di Fourier, ovvero come una combinazione, più o meno complessa, di funzioni periodiche (serie di Fourier).. la forma

R50/53 - Altamente tossico per gli organismi acquatici, può provocare a lungo termine effetti negativi per l'ambiente acquatico R51/53 - Tossico per gli organismi acquatici,

Tale norma sanziona come atto di concorrenza sleale………l’uso di ogni altro mezzo non conforme ai principi della correttezza professionale ed idoneo a danneggiare

‣ Notiamo che ogni nodo può venire accodato al più una volta, perché deve passare da bianco a grigio prima di venire accodato e non tornerà mai più bianco, quindi il ciclo

Il rischio che la dicotomia tra le nobili finalità del Rotary International, (compresa la teorizzazione della riscoperta dei valori) ed il veicolare all’interno della vita dei Club