Sei sulla pagina 1di 8

Breadth-first search

Preliminari
„ Problema:
Dato un grafo G e un vertice s (source), si vogliono
esplorare tutti i vertici di G raggiungibili da s

„ Esplorazione in modalità BFS:


‰ la frontiera tra vertici esplorati e vertici inesplorati si sposta
uniformemente per tutta la sua ampiezza (breadth-first
search)
‰ I vertici a distanza k vengono tutti scoperti prima di ogni
vertice a distanza k+1
(distanza = lunghezza del cammino minimo da s)

1
Descrizione dell’algoritmo

„ Per mantenere traccia della “frontiera” si


colorano i vertici
‰ bianco = vertici inesplorati
‰ grigio = vertici scoperti
‰ nero = vertici adiacenti tutti scoperti

Proprietà:
(u,v)∈E, color[u]=nero → color[v] ∈{nero, grigio}

Descrizione dell’algoritmo

„ Per garantire la strategia breadth-first i vertici non


appena scoperti vengono inseriti in una coda (Q)
„ Procedura termina quando Q si svuota
„ Input:
‰ Grafo G
‰ Vertice iniziale s
„ Notazione:
‰ d[u] = distanza da s
‰ π[u] = predecessore sul cammino minimo da s
‰ color[u] = colore di u

2
Pseudo-codice BFS
BFS(G, s)

for each vertex u ∈V[G] - {s}


do color[u] ← BIANCO, d[u] ← ∞, π[u] ← NIL
color[s] ← GRIGIO, d[s] ← 0, π[s] ← NIL
Q ← {s}
while Q ≠ Ø
do u ← DEQUEUE(Q)
for each v ∈ Adj[u]
do if color[v] = BIANCO then color[v] ← GRIGIO
d[v] ← d[u] + 1
π[v] ← u
ENQUEUE(Q, v)
color[u] ← NERO

Esempio BFS
0
Inizializzazione

A B ∞
C
∞ F ∞
E

∞ D
G

Coda
A

3
Esempio BFS 0

A
Nodi adiacenti B ∞
C
Coda
∞ F ∞
E
A
∞ D
G ∞
0

A B ∞
C
Coda
1 F ∞
E
A F
∞ D
G

Esempio BFS 0 1
A B ∞
1 C
Coda F ∞
E
F B
∞ D
G ∞
0
1
A B ∞
Coda 2 C
1 F
B D E E

2 D
G

4
Esempio BFS 0
1
A B 2
Coda 2 C
1 F
D E C E

2 D
G
0 ∞
1
A B 2
Coda 2 C
1 F
E C E

2 D
G

0
Esempio BFS 1
A B 2
Coda 2 C
1 F
C G E

2 D
G 3
0
1
A B 2
Coda 2 C
F
E

2 D
G 3

5
Analisi complessità (liste di adiacenza)

1) L’ if-then assicura che ogni vertice è inserito


e cancellato dalla coda al più una volta
‰ Costo operazioni sulla coda O(V)
2) La lista di adiacenza di u è scorsa solo
quando u viene rimosso dalla coda
‰ Somma dei tempi per scorrere tutte le liste di
adiacenza O(E)
3) Inizializzazione O(V)
„ Tempo totale O(V+E)

Correttezza di BFS

Teorema.
1. BFS(G,s) scopre tutti i vertici raggiungibili
da s
2. d[u] è la lunghezza del cammino min. da s

3. cammino minimo da s a u =

cammino minimo da s a π[u] + (π[u], u)

(Nota: BFS funziona su grafi direzionati e non)

6
Sottografo predecessore

„ Dato un grafo G=(V,E), un sottografo


predecessore è Gπ = (Vπ, Eπ) dove:
‰ Vπ = {v ∈ V: π[v] ≠ NIL} ∪ { s}
‰ Eπ = {(π[v], v) ∈ V : v ∈ Vπ - {s}}

„ Gπ è un albero breadth-first se
‰ Vπ contiene i vertici raggiungibili da s,
‰ ∀ v ∈ V, vi è un unico cammino da s a v in
Gπ ed è minimo
‰ |Eπ| = |Vπ| -1

Alberi breadth-first

„ BFS costruisce π in modo che Gπ è un albero


breadth first
Print-Path (G,s,v)
if v=s then print s
else if π[v] =NIL then
print “Non ci sono percorsi tra s e v”
else Print-Path(G,s, π[v])
print v

(Stampa cammino minimo da s a v)

7
Esercizi

„ Complessità di BFS se si utilizza matrice di


adiacenza
„ Un grafo è bipartito se esiste una partizione
dei suoi vertici (V’,V’’) tale che ∀ arco (u,v):
u ∈V’ e v ∈ V’’ oppure u ∈ V’’ e v ∈ V
‰ Dare un algoritmo efficiente per determinare se un
grafo non direzionato è bipartito