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
© Copyright 2024 Paperzz