Laboratorio di Algoritmi e Strutture Dati Ingegneria e Scienze

Visita di un grafo
Code
Laboratorio di Algoritmi e Strutture Dati
Ingegneria e Scienze Informatiche - Cesena
A.A. 2013-2014
Pietro Di Lena
dilena@cs.unibo.it, pietro.dilena@unibo.it
Pietro Di Lena
Laboratorio di Algoritmi e Strutture Dati
Visita di un grafo
Code
Breadth First Search: esempio
Breadth First Search: pseudocodice
Breadth First Search
La ricerca in ampiezza (Breadth First Search) `e una procedura di vista di
un grafo.
Dato un vertice sorgente, produce un albero di copertura per la
componente connessa a cui appartiene il vertice sorgente.
L’albero di copertura calcola la distanza minima (intesa come il minimo
numero di archi) da ogni vertice raggiungibile dalla sorgente.
Costo computazionale: O(|V | + |E |).
Utilizza una struttura dati ausiliaria di tipo coda.
Informazioni aggiuntive utilizzate dalla DFS:
colore di un nodo (c[]): WHITE (non visitato), GREY (in visita), BLACK
(gi`
a visitato)
puntatore al padre (p[]): contiene le informazione per ricostruire l’albero di
copertura
distanza (d[]): mantiene la distanza dal nodo sorgente
Pietro Di Lena
Laboratorio di Algoritmi e Strutture Dati
Visita di un grafo
Code
Breadth First Search: esempio
Breadth First Search: pseudocodice
Breadth First Search: esempio
Q = {}
p[b]=NIL
d[b]=∞
b
0
p[d]=NIL
d[d]=∞
1
d
1
p[a]=NIL
d[a]=∞
5
a
2
1
3
c
p[c]=NIL
d[c]=∞
Pietro Di Lena
4
e
p[e]=NIL
d[e]=∞
Laboratorio di Algoritmi e Strutture Dati
Visita di un grafo
Code
Breadth First Search: esempio
Breadth First Search: pseudocodice
Breadth First Search: esempio
Q = {a}
p[b]=NIL
d[b]=∞
b
0
p[d]=NIL
d[d]=∞
1
d
1
p[a]=NIL
d[a]=0
5
a
2
1
3
c
p[c]=NIL
d[c]=∞
Pietro Di Lena
4
e
p[e]=NIL
d[e]=∞
Laboratorio di Algoritmi e Strutture Dati
Visita di un grafo
Code
Breadth First Search: esempio
Breadth First Search: pseudocodice
Breadth First Search: esempio
Q = {}
p[b]=NIL
d[b]=∞
b
0
p[d]=NIL
d[d]=∞
1
d
1
p[a]=NIL
d[a]=0
5
a
2
1
3
c
p[c]=NIL
d[c]=∞
Pietro Di Lena
4
e
p[e]=NIL
d[e]=∞
Laboratorio di Algoritmi e Strutture Dati
Visita di un grafo
Code
Breadth First Search: esempio
Breadth First Search: pseudocodice
Breadth First Search: esempio
Q = {b}
p[b]=a
d[b]=d[a]+1=1
b
0
p[d]=NIL
d[d]=∞
1
d
1
p[a]=NIL
d[a]=0
5
a
2
1
3
c
p[c]=NIL
d[c]=∞
Pietro Di Lena
4
e
p[e]=NIL
d[e]=∞
Laboratorio di Algoritmi e Strutture Dati
Visita di un grafo
Code
Breadth First Search: esempio
Breadth First Search: pseudocodice
Breadth First Search: esempio
Q = {b,c}
p[b]=a
d[b]=d[a]+1=1
1
b
0
p[d]=NIL
d[d]=∞
d
1
p[a]=NIL
d[a]=0
5
a
2
1
3
4
c
p[c]=a
d[c]=d[a]+1=1
Pietro Di Lena
e
p[e]=NIL
d[e]=∞
Laboratorio di Algoritmi e Strutture Dati
Visita di un grafo
Code
Breadth First Search: esempio
Breadth First Search: pseudocodice
Breadth First Search: esempio
Q = {b,c}
p[b]=a
d[b]=d[a]+1=1
1
b
0
p[d]=NIL
d[d]=∞
d
1
p[a]=NIL
d[a]=0
5
a
2
1
3
4
c
p[c]=a
d[c]=d[a]+1=1
Pietro Di Lena
e
p[e]=NIL
d[e]=∞
Laboratorio di Algoritmi e Strutture Dati
Visita di un grafo
Code
Breadth First Search: esempio
Breadth First Search: pseudocodice
Breadth First Search: esempio
Q = {c}
p[b]=a
d[b]=d[a]+1=1
1
b
0
p[d]=NIL
d[d]=∞
d
1
p[a]=NIL
d[a]=0
5
a
2
1
3
4
c
p[c]=a
d[c]=d[a]+1=1
Pietro Di Lena
e
p[e]=NIL
d[e]=∞
Laboratorio di Algoritmi e Strutture Dati
Visita di un grafo
Code
Breadth First Search: esempio
Breadth First Search: pseudocodice
Breadth First Search: esempio
Q = {c,d}
p[b]=a
d[b]=d[a]+1=1
1
b
0
p[d]=b
d[d]=d[b]+1=2
d
1
p[a]=NIL
d[a]=0
5
a
2
1
3
4
c
p[c]=a
d[c]=d[a]+1=1
Pietro Di Lena
e
p[e]=NIL
d[e]=∞
Laboratorio di Algoritmi e Strutture Dati
Visita di un grafo
Code
Breadth First Search: esempio
Breadth First Search: pseudocodice
Breadth First Search: esempio
Q = {c,d}
p[b]=a
d[b]=d[a]+1=1
1
b
0
p[d]=b
d[d]=d[b]+1=2
d
1
p[a]=NIL
d[a]=0
5
a
2
1
3
4
c
p[c]=a
d[c]=d[a]+1=1
Pietro Di Lena
e
p[e]=NIL
d[e]=∞
Laboratorio di Algoritmi e Strutture Dati
Visita di un grafo
Code
Breadth First Search: esempio
Breadth First Search: pseudocodice
Breadth First Search: esempio
Q = {d}
p[b]=a
d[b]=d[a]+1=1
1
b
0
p[d]=b
d[d]=d[b]+1=2
d
1
p[a]=NIL
d[a]=0
5
a
2
1
3
4
c
p[c]=a
d[c]=d[a]+1=1
Pietro Di Lena
e
p[e]=NIL
d[e]=∞
Laboratorio di Algoritmi e Strutture Dati
Visita di un grafo
Code
Breadth First Search: esempio
Breadth First Search: pseudocodice
Breadth First Search: esempio
Q = {d,e}
p[b]=a
d[b]=d[a]+1=1
1
b
0
p[d]=b
d[d]=d[b]+1=2
d
1
p[a]=NIL
d[a]=0
5
a
2
1
3
4
c
p[c]=a
d[c]=d[a]+1=1
Pietro Di Lena
e
p[e]=c
d[e]=d[c]+1=2
Laboratorio di Algoritmi e Strutture Dati
Visita di un grafo
Code
Breadth First Search: esempio
Breadth First Search: pseudocodice
Breadth First Search: esempio
Q = {d,e}
p[b]=a
d[b]=d[a]+1=1
1
b
0
p[d]=b
d[d]=d[b]+1=2
d
1
p[a]=NIL
d[a]=0
5
a
2
1
3
4
c
p[c]=a
d[c]=d[a]+1=1
Pietro Di Lena
e
p[e]=c
d[e]=d[c]+1=2
Laboratorio di Algoritmi e Strutture Dati
Visita di un grafo
Code
Breadth First Search: esempio
Breadth First Search: pseudocodice
Breadth First Search: esempio
Q = {e}
p[b]=a
d[b]=d[a]+1=1
1
b
0
p[d]=b
d[d]=d[b]+1=2
d
1
p[a]=NIL
d[a]=0
5
a
2
1
3
4
c
p[c]=a
d[c]=d[a]+1=1
Pietro Di Lena
e
p[e]=c
d[e]=d[c]+1=2
Laboratorio di Algoritmi e Strutture Dati
Visita di un grafo
Code
Breadth First Search: esempio
Breadth First Search: pseudocodice
Breadth First Search: esempio
Q = {e}
p[b]=a
d[b]=d[a]+1=1
1
b
0
p[d]=b
d[d]=d[b]+1=2
d
1
p[a]=NIL
d[a]=0
5
a
2
1
3
4
c
p[c]=a
d[c]=d[a]+1=1
Pietro Di Lena
e
p[e]=c
d[e]=d[c]+1=2
Laboratorio di Algoritmi e Strutture Dati
Visita di un grafo
Code
Breadth First Search: esempio
Breadth First Search: pseudocodice
Breadth First Search: esempio
Q = {}
p[b]=a
d[b]=d[a]+1=1
1
b
0
p[d]=b
d[d]=d[b]+1=2
d
1
p[a]=NIL
d[a]=0
5
a
2
1
3
4
c
p[c]=a
d[c]=d[a]+1=1
Pietro Di Lena
e
p[e]=c
d[e]=d[c]+1=2
Laboratorio di Algoritmi e Strutture Dati
Visita di un grafo
Code
Breadth First Search: esempio
Breadth First Search: pseudocodice
Breadth First Search: esempio
Q = {}
p[b]=a
d[b]=d[a]+1=1
1
b
0
p[d]=b
d[d]=d[b]+1=2
d
1
p[a]=NIL
d[a]=0
5
a
2
1
3
4
c
p[c]=a
d[c]=d[a]+1=1
Pietro Di Lena
e
p[e]=c
d[e]=d[c]+1=2
Laboratorio di Algoritmi e Strutture Dati
Visita di un grafo
Code
Breadth First Search: esempio
Breadth First Search: pseudocodice
Breadth First Search: esempio
Albero di copertura prodotto dalla BFS a partire dal vertice sorgente a.
a
0
1
b
c
1
2
d
e
2
Pietro Di Lena
Laboratorio di Algoritmi e Strutture Dati
Visita di un grafo
Code
Breadth First Search: esempio
Breadth First Search: pseudocodice
Breadth First Search: pseudocodice
1: procedure BFS(G , u)
2:
for each vertex v in G do
3:
c[v ] ← WHITE
4:
p[v ] ← NIL
5:
d[v ] ← ∞
6:
end for
7:
Q ← EmptyQueue(VertexSize(G))
8:
c[u] ← GREY
9:
d[u] ← 0
10:
Enqueue(Q, u)
11:
while not IsEmpty(Q) do
12:
v ← Dequeue(Q)
13:
for each vertex w in G adj to v do
14:
if c[w ] = WHITE then
15:
c[w ] ← GREY
16:
p[w ] ← v
17:
d[w ] ← d[v ] + 1
18:
Enqueue(Q, w )
19:
end if
20:
end for
21:
c[v ] ← BLACK
22:
end while
23: end procedure
Quale implementazione `
e maggiormente efficiente: con liste o matrici di adiacenza?
Pietro Di Lena
Laboratorio di Algoritmi e Strutture Dati
Visita di un grafo
Code
Code
Code con lista circolare: pseudocodice
Code
Una coda `
e una struttura dati di tipo FIFO (First In First Out)
Implementazione con liste concatenate:
Ogni elemento nella coda ha un puntatore all’elemento successivo, tranne l’elemento in
coda (punta a NULL).
Richiede un puntatore alla testa (head, primo elemento) e uno alla coda (tail, ultimo
elemento)
Quando la lista contiene un solo elemento, head e tail puntano allo stesso elemento.
Implementazione con liste circolari:
La coda viene allocata come un array di dimensione massima prefissata.
L’ultima posizione dell’array viene considerata contigua alla prima, i.e. l’elemento
successivo all’ultimo elemento `
e il primo nell’array.
Richiede un indice alla testa (head, primo elemento), uno alla coda (tail, ultimo
elemento) e una variable (size) che conta il numero di elementi in coda.
Quando la lista contiene un solo elemento, head e tail indicizzano lo stesso elemento.
Operazioni basilari sulla struttura dati coda:
EmptyQueue: crea una coda vuota
Enqueue: aggiunge un elemento in coda alla lista
Dequeue: rimuove e restituisce l’elemento in testa alla coda
IsEmpty: controlla che la coda sia vuota o meno
Pietro Di Lena
Laboratorio di Algoritmi e Strutture Dati
Visita di un grafo
Code
Code
Code con lista circolare: pseudocodice
Code con lista circolare: pseudocodice
1: function EmptyQueue(n)
2:
Q ← allocate array of size n
3:
head(Q) ← tail(Q) ← NIL
4:
size(Q) ← 0
5:
maxsize(Q) ← n
6:
return Q
7: end function
1: function IsEmpty(Q)
2:
if size(Q) =0 then
3:
return TRUE
4:
else
5:
return FALSE
6:
end if
7: end function
1: procedure Enqueue(Q, w )
2:
if size(Q) < maxsize(Q) then
3:
if size(Q) =0 then
4:
head(Q) ← tail(Q) ← 1
5:
else
6:
tail(Q) ←Mod(tail(Q)+1,maxsize(Q))
7:
end if
8:
Q[tail(Q)] ← w
9:
size(Q) ← size(Q) + 1
10:
end if
11: end procedure
1: function Dequeue(Q)
2:
if size(Q) > 0 then
3:
w ← Q[head(Q)]
4:
size(Q) ← size(Q) − 1
5:
head(Q) ←Mod(head(Q)+1,maxsize(Q))
6:
return w
7:
else
8:
return NIL
9:
end if
10: end function
Mod(a, b) rappresenta l’operazione ”a modulo b” (a%b in C).
Pietro Di Lena
Laboratorio di Algoritmi e Strutture Dati