Algoritmi di visita di un grafo - Dipartimento di Ingegneria dell
by user
Comments
Transcript
Algoritmi di visita di un grafo - Dipartimento di Ingegneria dell
Algoritmi di visita di un grafo Ilaria Castelli [email protected] Università degli Studi di Siena Dipartimento di Ingegneria dell’Informazione A.A. 2009/2010 I. Castelli Visita di un grafo, A.A. 2009/2010 1/44 Grafi Visita in ampiezza Visita in profondità Ordinamento topologico I. Castelli Visita di un grafo, A.A. 2009/2010 2/44 Scopo e tipi di visita di un grafo Visita Una visita (o attraversamento) di un grafo G permette di esaminare i nodi e gli archi di G in modo sistematico. Esistono varie tipologie di visita, con diverse proprietà. In particolare: 1 Visita in ampiezza (BFS = Breadth First Search) 2 Visita in profondità (DFS = Depth First Search) I. Castelli Visita di un grafo, A.A. 2009/2010 3/44 Breadth First Search Visita in ampiezza Dato un grafo G = (V, E) e un nodo s chiamato sorgente, la visita in ampiezza esplora gli archi di G per scoprire tutti i nodi raggiungibili a partire da s La visita BFS calcola la distanza (numero minimo di archi) tra s e ogni vertice da esso raggiungibile La visita consente di definire un albero BFS, con radice s, contenente tutti i nodi raggiungibili Nell’ albero BFS il cammino da s a un nodo v corrisponde a un cammino minimo (contenente il numero minimo di archi) La visita BFS si può applicare sia ai grafi diretti che a quelli non diretti I. Castelli Visita di un grafo, A.A. 2009/2010 4/44 Breadth First Search La visita in ampiezza esplora i nodi del grafo partendo da quelli a distanza 1 da s. Poi visita quelli a distanza 2, e cosı̀ via. L’algoritmo visita tutti i vertici ad un livello k prima di visitare quelli a livello k + 1. distanza = 3 distanza = 2 i distanza = 1 Si genera un albero h v r Si visitano nodi via via più distanti dalla sorgente s w t u x y I. Castelli Visita di un grafo, A.A. 2009/2010 5/44 Breadth First Search Per tenere traccia del progresso della visita, l’algoritmo BFS associa delle “flag” ai nodi. Supponiamo di poter colorare i nodi di bianco, grigio o nero. All’inizio tutti i nodi sono bianchi e, successivamente, possono diventare grigi e, infine, neri. Un nodo viene scoperto la prima volta che viene incontrato durante la visita e, in tale istante, cessa di essere bianco. La distinzione tra nodi grigi e neri esiste affinché la visita proceda in ampiezza. In sostanza, la distinzione è la seguente: I I I I. Castelli Bianchi: non ancora scoperti Grigi: appena scoperti; sono la frontiera tra nodi scoperti e non. I nodi adiacenti ad un nodo grigio possono essere bianchi. Neri: scoperti. Tutti i nodi adiacenti ad un nodo nero sono stati scoperti. Visita di un grafo, A.A. 2009/2010 6/44 Algoritmo BFS - Strutture dati Le strutture dati usate dall’algoritmo sono le seguenti: Liste di adiacenza “Adj” Adj[u] è la lista dei nodi adiacenti a u. Array “color” color[u] contiene il colore del nodo u Array “d” d[u] contiene la distanza di u dal nodo sorgente s. Viene inizializzata a “infinito”. Array “p” p[u] contiene il predecessore del nodo u nell’albero BFS Coda “Q” contiene i nodi grigi I. Castelli Visita di un grafo, A.A. 2009/2010 7/44 Algoritmo BFS 1 2 3 4 5 BFS (G , s ) f o r o g n i nodo u i n V [ G ] − { s } /∗ i n i z i a l i z z a z i o n e ∗/ c o l o r [ u ] = WHITE d[u] = infinity p [ u ] = NIL 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 c o l o r [ s ] = GRAY /∗ v i s i t o l a s o r g e n t e ∗/ d[ s ] = 0 p [ s ] = NIL Q = {s} w h i l e Q != empty u = head [Q] /∗ nodo da e s p a n d e r e ∗/ f o r o g n i nodo v i n Adj [ u ] /∗ v i s i t o i n o d i a d i a c e n t i ∗/ i f c o l o r [ v ] = WHITE /∗ s e e ’ b i a n c o v i e n e s c o p e r t o ∗/ t h e n c o l o r [ v ] = GRAY d[v] = d[u] + 1 p[v] = u ENQUEUE(Q, v ) /∗ i n s e r i t o n e l l a coda Q ∗/ DEQUEUE(Q) /∗ t o l t o d a l l a coda : e ’ g i a ’ s t a t o e s p a n s o ∗/ c o l o r [ u ] = BLACK I. Castelli Visita di un grafo, A.A. 2009/2010 8/44 Algoritmo BFS - Esempio d r p inf r NIL inf s NIL Adj − u r v s inf s r w − inf t NIL t w x u inf u NIL u t v inf v NIL v r w inf w NIL inf inf inf inf w s x inf x NIL v w x y x w y inf y NIL Q = {} y u x s t I. Castelli r s inf inf t inf Visita di un grafo, A.A. 2009/2010 u − t x − t y − y − − − 9/44 Algoritmo BFS - Esempio d r p inf r NIL 0 s NIL Adj − u r v s inf s r w − inf t NIL t w x u inf u NIL u t v inf v NIL v r w inf w NIL inf inf inf inf w s x inf x NIL v w x y x w y inf y NIL Q = {s} y u x s t I. Castelli r inf s 0 t inf Visita di un grafo, A.A. 2009/2010 u − t x − t y − y − − − 9/44 Algoritmo BFS - Esempio p d r 1 r 0 s NIL s Adj − u r v s inf s r w − inf t NIL t w x u inf u NIL u t v inf v NIL v r w 1 w s x w y u x s t x y w s r 1 s 0 t inf inf 1 inf inf inf x NIL v w x y inf y NIL Q = {w, r} I. Castelli Visita di un grafo, A.A. 2009/2010 u − t x − t y − y − − − 9/44 Algoritmo BFS - Esempio p d r s t 1 r 0 s NIL 2 t s Adj r 1 s 0 t 2 r v s inf s r w − t w x w u − t x − t y − u inf u NIL u t v inf v NIL v r w w s x w y u x 1 w x 2 x y inf I. Castelli s inf 1 2 inf w v w x y y NIL − u Q = {r, t, x} Visita di un grafo, A.A. 2009/2010 y − − − 9/44 Algoritmo BFS - Esempio p d r s t 1 r 0 s NIL 2 t s Adj r 1 s 0 t 2 r v s inf s r w − t w x w u − t x − t y − u inf u NIL u t v 2 v r v r w s 2 1 2 inf w s w v w x y x w y u x 1 w x 2 x y inf I. Castelli y NIL − u Q = {t, x, v} Visita di un grafo, A.A. 2009/2010 y − − − 9/44 Algoritmo BFS - Esempio p d r s 1 r 0 s NIL s Adj r 1 s 0 t 2 r v s 3 s r w − w x 2 t w t u 3 u t u t v 2 v r v r w s 2 1 2 inf w s w v w x y x w y u x t 1 w x 2 x y inf I. Castelli y NIL − u Q = {x, v, u} Visita di un grafo, A.A. 2009/2010 u − t x − t y − y − − − 9/44 Algoritmo BFS - Esempio p d r s 1 r 0 s NIL s Adj r 1 s 0 t 2 r v s 3 s r w − w x 2 t w t u 3 u t u t v 2 v r v r w w s x w y u x t 1 w s 2 1 2 3 x 2 x w v w x y y 3 y x Q = {v, u, y} I. Castelli − u Visita di un grafo, A.A. 2009/2010 u − t x − t y − y − − − 9/44 Algoritmo BFS - Esempio p d r s 1 r 0 s NIL s Adj r 1 s 0 t 2 r v s 3 s r w − w x 2 t w t u 3 u t u t v 2 v r v r w w s x w y u x t 1 w s 2 1 2 3 x 2 x w v w x y y 3 y x Q = {u, y} I. Castelli − u Visita di un grafo, A.A. 2009/2010 u − t x − t y − y − − − 9/44 Algoritmo BFS - Esempio p d r s 1 r 0 s NIL s Adj r 1 s 0 t 2 r v s 3 s r w − w x 2 t w t u 3 u t u t v 2 v r v r w w s x w y u x t 1 w s 2 1 2 3 x 2 x w v w x y y 3 y x Q = {y} I. Castelli − u Visita di un grafo, A.A. 2009/2010 u − t x − t y − y − − − 9/44 Algoritmo BFS - Esempio p d r s 1 r 0 s NIL s Adj r 1 s 0 t 2 r v s 3 s r w − w x 2 t w t u 3 u t u t v 2 v r v r w w s x w y u x t 1 w s 2 1 2 3 x 2 x w v w x y y 3 y x Q = {} I. Castelli − u Visita di un grafo, A.A. 2009/2010 u − t x − t y − y − − − 9/44 Algoritmo BFS - Albero BFS La visita BFS consente di definire un albero BFS. all’inizio contiene solo s quando un nodo bianco v viene scoperto, scorrendo la lista di adiacenza di un nodo u, allora l’arco (u, v) e v stesso vengono aggiunti all’albero p(r) = s r p(s) = NIL s p(t) = w t p(u) = t u 1 0 2 3 2 1 v p(v) = r w p(w) = s I. Castelli 2 x p(x) = w s r 1 v 2 0 w 1 x 2 t 2 y 3 u 3 3 y p(y) = x Visita di un grafo, A.A. 2009/2010 10/44 Breadth First Search - Analisi Analisi del tempo di esecuzione su un grafo G = (V, E) Il tempo necessario per l’inizializzazione è O(| V |) Ogni nodo raggiungibile viene visitato una volta I I Le operazioni di inserimento e rimozione dalla coda costano O(1), quindi il tempo totale necessario per le operazioni sulla coda è O(| V |) La lista di adiacenza di un nodo viene scorsa una sola volta, quindi in totale il tempo è O(| E |) Il tempo totale richiesto dall’algoritmo BFS si ottiene sommando il tempo per l’inizializzazione e quello necessario per visitare i nodi: O(| V | + | E |) I. Castelli Visita di un grafo, A.A. 2009/2010 11/44 Breadth First Search - Cammini minimi Distanza minima Si definisce distanza minima δ(s, v) da s a v, il numero minimo di archi di un cammino dal nodo s al nodo v δ(s, v) ≥ 0 δ(s, v) = ∞ se v non è raggiungibile partendo da s Cammino minimo Un cammino di lunghezza δ(s, v) da s a v si dice cammino minimo. Nota: possono esistere più cammini minimi tra due nodi BFS La visita BFS calcola la distanza minima δ(s, v) di ogni nodo v raggiungibile da s Nell’albero BFS il cammino da s ad un nodo v è un cammino minimo I. Castelli Visita di un grafo, A.A. 2009/2010 12/44 Breadth First Search - Proprietà Lemma Dato un grafo G = (V, E) diretto o non diretto e un nodo s ∈ V qualsiasi, allora per ogni arco (u, v) ∈ E si ha δ(s, v) ≤ δ(s, u) + 1 Dimostrazione Se u non è raggiungibile da s, allora δ(s, u) = ∞ Se u è raggiungibile da s, allora anche v è raggiungibile. Il cammino minimo da s a v non può essere più lungo del cammino minimo da s a u, più l’arco (u, v) I. Castelli Visita di un grafo, A.A. 2009/2010 13/44 Breadth First Search - Proprietà Lemma Sia G = (V, E) un grafo diretto o non diretto e s ∈ V un nodo sorgente qualsiasi, a partire dal quale è stato eseguito l’algoritmo BFS. Allora per ogni nodo v ∈ V si ha d[v] ≥ δ(s, v) Dimostrazione Per induzione: d[s] = 0 = δ(s, s) e, per qualsiasi nodo v ∈ V − {s}, vale d[v] = ∞ ≥ δ(s, v) Dato un nodo v scoperto durante l’esplorazione di un nodo u, per ipotesi induttiva vale d[u] ≥ δ(s, u). d[v] |{z} = d[u] + 1 algoritmo I. Castelli ≥ |{z} δ(s, u) + 1 ipotesi induttiva Visita di un grafo, A.A. 2009/2010 ≥ |{z} δ(s, v) lemma precedente 14/44 Breadth First Search - Proprietà Lemma Supponendo che durante l’esecuzione della ricerca BFS su un grafo G = (V, E), la coda Q contenga i nodi < v1 , . . . , vr >, dove v1 = head[Q] e vr = tail[Q], allora d[vr ] ≤ d[v1 ] + 1 e d[vi ] ≤ d[vi+1 ], i = 1, . . . , r − 1 La differenza tra le distanze da s dei nodi presenti nella coda in un certo momento è al più 1 Un nodo v viene inserito nella coda (diventando vr+1 ) quando il nodo in testa, v1 , viene esplorato d[vr+1 ] = d[v] = d[v1 ] + 1 d[vr ] ≤ d[v1 ] + 1 = d[v] = d[vr+1 ] I. Castelli Visita di un grafo, A.A. 2009/2010 15/44 Breadth First Search - Proprietà Proposizione I nodi che entrano nella coda Q sono tutti e soli i nodi u tali che δ(s, u) < ∞, cioè tutti i nodi raggiungibili da s Dimostrazione 1 v entra in Q =⇒ δ(s, v) < ∞ Si procede per induzione sull’i-esima iterazione dell’operazione EN QU EU E I I se i = 0, solo s è nella coda: δ(s, s) = 0 < ∞ se i > 0, supponiamo che l’ipotesi induttiva sia vera per ogni iterazione k < i. Al passo i si visita Adj[u], con u = head[Q], e i nodi bianchi vengono inseriti in Q. Per ipotesi induttiva δ(s, u) < ∞. Poiché esiste l’arco (u, v): δ(s, v) ≤ δ(s, u) + 1 < ∞ I. Castelli Visita di un grafo, A.A. 2009/2010 16/44 Breadth First Search - Proprietà 2 v entra in Q ⇐= δ(s, v) < ∞ Si procede per induzione su δ(s, v) = k I I se δ(s, v) = 0 è vero: v = s se δ(s, v) = k > 0, per ipotesi induttiva si ha che per ogni u tale che δ(s, u) < k, u è già entrato in coda. Poiché δ(s, v) < ∞, esiste un cammino < v0 , . . . , vi−1 , vi > da s a v, con v0 = s e vi = v. s v0 v(i−1) v δ(s, vi−1 ) = k − 1 e vi−1 è nella coda per ipotesi induttiva. Quando verrà visitata Adj[vi−1 ] verrà scoperto v e: F F I. Castelli se è bianco entra in coda v non può essere grigio o nero, altrimenti sarebbe già entrato in coda, perché varrebbe δ(s, v) < k ! Visita di un grafo, A.A. 2009/2010 17/44 Breadth First Search - Albero BFS Albero BFS L’array p definisce un sottografo dei predecessori di G. In particolare, si tratta di un albero, Tp : Tp = (Vp , Ep ) Vp = {v ∈ V : p[v] 6= N IL} ∪ {s} Ep = {(p[v], v) ∈ E : v ∈ Vp − {s}} Una volta eseguita la ricerca BFS, la seguente procedura stampa il cammino minimo da s a v 1 2 3 4 5 6 7 PRINT−PATH(G , s , v ) if v = s then p r i n t s e l s e i f p [ v ] = NIL t h e n p r i n t " non esiste un cammino da s a v" e l s e PRINT−PATH(G , s , p [ v ] ) print v I. Castelli Visita di un grafo, A.A. 2009/2010 18/44 Depth First search Visita in profondità Dato un grafo G = (V, E) ed un nodo s, detto nodo sorgente, la visita depth first esplora il grafo andando il più possibile in profondità. Dato un nodo v appena scoperto, la visita prosegue a partire da v sui suoi archi che ancora non sono stati esplorati Quando si sono esplorati tutti gli archi del nodo v, si torna al nodo dal quale v è stato scoperto, e si esplorano i suoi ulteriori archi non ancora esplorati (se ce ne sono) Si prosegue finchè non vengono scoperti tutti i nodi raggiungibili da s Se vi sono ancora dei nodi non scoperti, uno di questi viene adottato come una nuova sorgente, e la visita riprende a partire da esso L’algoritmo termina quando tutti i nodi sono stati scoperti I. Castelli Visita di un grafo, A.A. 2009/2010 19/44 Depth First Search Per tenere traccia del progresso della visita, anche l’algoritmo DFS associa delle “flag” ai nodi. Di nuovo, si suppone di colorare i nodi di bianco, grigio o nero. All’inizio tutti i nodi sono bianchi e, successivamente, possono diventare grigi e, infine, neri. Un nodo viene scoperto la prima volta che viene incontrato durante la visita e, in tale istante, cessa di essere bianco. La distinzione tra nodi grigi e neri è necessaria affinché la visita proceda in profondità. La distinzione è la seguente: I I I I. Castelli Bianchi: non ancora scoperti Grigi: sono stati scoperti, ma l’esplorazione della loro lista di adiacenza non è ancora terminata. Neri: l’esplorazione della loro lista di adiacenza è completata. Visita di un grafo, A.A. 2009/2010 20/44 Algoritmo DFS - Strutture dati Le strutture dati usate dall’algoritmo sono le seguenti: Liste di adiacenza “Adj” Adj[u] è la lista dei nodi adiacenti a u. Array “color” color[u] contiene il colore del nodo u Array “p” p[u] contiene il predecessore del nodo u nella foresta DFS Array “d” d[u] è un timestamp che contiene il momento in cui u è stato scoperto. Array “f” f [u] è un timestamp che contiene il momento in cui si è conclusa la visita di u, cioè si è finito di esaminare al sua lista di adiacenza Adj[u]. I. Castelli Visita di un grafo, A.A. 2009/2010 21/44 Algoritmo DFS - Strutture dati Nota: Il nodo u è bianco prima di d[u] grigio tra d[u] e f [u] nero dopo f [u] Ovviamente si ha d[u] < f [u], ∀u ∈ V I timestamp sono numeri interi compresi tra 1 e 2 | V |, poiché ogni nodo viene scoperto esattamente una volta, e si finisce di esplorarlo esattamente una volta. I. Castelli Visita di un grafo, A.A. 2009/2010 22/44 Algoritmo DFS 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 9 10 11 DFS(G , s ) f o r o g n i v e r t i c e u i n V [ G ] /∗ i n i z i a l i z z a z i o n e ∗/ c o l o r [ u ] = WHITE p [ u ] = NIL time = 0 for ogni v e r t i c e u in V[G] i f c o l o r [ u ] = WHITE t h e n DFS−VISIT ( u ) /∗ v i s i t a o g n i nodo non s c o p e r t o ∗/ DFS−VISIT ( u ) c o l o r [ u ] = GRAY d [ u ] = t i m e /∗ tempo d i i n i z i o v i s i t a l i s t a d i a d i a c e n z a ∗/ time = time + 1 f o r o g n i v e r t i c e v i n Adj [ u ] i f c o l o r [ v ] = WHITE then p [ v ] = u DFS−VISIT ( v ) /∗ v i s i t a s u b i t o n o d i non s c o p e r t i ∗/ c o l o r [ u ] = BLACK /∗ f i n i t o d i v i s i t a r e i n o d i a d i a c e n t i ∗/ f [ u ] = time time = time + 1 I. Castelli Visita di un grafo, A.A. 2009/2010 23/44 Algoritmo DFS - Esempio Adj u x I. Castelli v y w z u v v y − w y x v − y x − z z − Visita di un grafo, A.A. 2009/2010 x − z − 24/44 Algoritmo DFS - Esempio u v w y z 1/ x I. Castelli Visita di un grafo, A.A. 2009/2010 25/44 Algoritmo DFS - Esempio u v w 1/ x I. Castelli y z u v 1/ 2/ x y w z Visita di un grafo, A.A. 2009/2010 25/44 Algoritmo DFS - Esempio u v w 1/ u v 1/ 2/ w u v 1/ 2/ w 3/ x I. Castelli y z x y z Visita di un grafo, A.A. 2009/2010 x y z 25/44 Algoritmo DFS - Esempio u v w 1/ u v 1/ 2/ w u v 1/ 2/ w 3/ x y z w u v 1/ 2/ 4/ 3/ x y I. Castelli x y z x y z z Visita di un grafo, A.A. 2009/2010 25/44 Algoritmo DFS - Esempio u v w 1/ u v 1/ 2/ w u v 1/ 2/ w 3/ x y z u v w 1/ 2/ x y z u v w 1/ 2/ x y z B 4/ 3/ x y I. Castelli z 4/ 3/ x y z Visita di un grafo, A.A. 2009/2010 25/44 Algoritmo DFS - Esempio u v w 1/ u v 1/ 2/ w u v 1/ 2/ w 3/ x y z u v w 1/ 2/ x y z u v w 1/ 2/ x y z u v w 1/ 2/ B 4/ 3/ x y I. Castelli z B 4/ 3/ x y z Visita di un grafo, A.A. 2009/2010 4/5 3/ x y z 25/44 Algoritmo DFS - Esempio u v w 1/ u v 1/ 2/ w u v 1/ 2/ w 3/ x y z u v w 1/ 2/ x y z u v w 1/ 2/ x y z u v w 1/ 2/ B 4/ 3/ x y z v w u 1/ B 4/ 3/ x y z 4/5 3/ x y z 2/ B 4/5 3/6 x y I. Castelli z Visita di un grafo, A.A. 2009/2010 25/44 Algoritmo DFS - Esempio u v w 1/ u v 1/ 2/ w u v 1/ 2/ w 3/ x y z u v w 1/ 2/ x y z u v w 1/ 2/ x y z u v w 1/ 2/ B 4/ 3/ x y z v w u 1/ 2/ 4/ 3/ x y z v w u 1/ B 4/5 3/ x y z 2/7 B 4/5 3/6 x y I. Castelli B 4/5 z x 3/6 y z Visita di un grafo, A.A. 2009/2010 25/44 Algoritmo DFS - Esempio u v w 1/ u v 1/ 2/ w u v 1/ 2/ w 3/ x y z u v w 1/ 2/ x y z u v w 1/ 2/ x y z u v w 1/ 2/ B 4/ 3/ x y z v w u 1/ 2/ 4/ 3/ x y z v w u 1/ B 2/7 3/6 x y 4/5 z x 4/5 3/ x y z v w u 1/ B 4/5 I. Castelli B F 3/6 y z Visita di un grafo, A.A. 2009/2010 2/7 B 4/5 3/6 x y z 25/44 Algoritmo DFS - Esempio u v 1/8 F 2/7 B 4/5 3/6 x y I. Castelli w z Visita di un grafo, A.A. 2009/2010 26/44 Algoritmo DFS - Esempio u v 1/8 F 2/7 u F 3/6 x y v 1/8 B 4/5 I. Castelli w z 2/7 w 9/ B 4/5 3/6 x y z Visita di un grafo, A.A. 2009/2010 26/44 Algoritmo DFS - Esempio u v 1/8 F 2/7 u F 3/6 x y v 1/8 B 4/5 I. Castelli w z 2/7 w 9/ B u 1/8 F 4/5 3/6 x y z Visita di un grafo, A.A. 2009/2010 v w 2/7 B 9/ C 4/5 3/6 x y z 26/44 Algoritmo DFS - Esempio u v 1/8 F w 2/7 F 3/6 x y z u v w 1/8 2/7 B 2/7 w 9/ B u 1/8 F 4/5 3/6 x y z v w 2/7 B 9/ C 4/5 3/6 x y z 9/ C 4/5 3/6 x y I. Castelli v 1/8 B 4/5 F u 10/ z Visita di un grafo, A.A. 2009/2010 26/44 Algoritmo DFS - Esempio u v 1/8 F w 2/7 F 3/6 x y z u v w 1/8 2/7 B 3/6 x y I. Castelli 9/ C 4/5 v 1/8 B 4/5 F u w 2/7 F 3/6 x y z u v w 1/8 2/7 B v 1/8 9/ B 4/5 F u w 2/7 B 9/ C 4/5 3/6 x y z 9/ C 10/ 4/5 3/6 z x y 10/ z B Visita di un grafo, A.A. 2009/2010 26/44 Algoritmo DFS - Esempio u v 1/8 F w 2/7 F 3/6 x y z u v w 1/8 2/7 B 3/6 x y I. Castelli 9/ C 4/5 v 1/8 B 4/5 F u z 2/7 F 3/6 x y z u v w 1/8 2/7 4/5 x u B 9/ C 3/6 y v 1/8 9/ B 4/5 F 10/ w z B Visita di un grafo, A.A. 2009/2010 2/7 B 9/ C 4/5 3/6 x y z u v w 1/8 2/7 F 10/ w B 9/ C 4/5 3/6 x y 10/11 z B 26/44 Algoritmo DFS - Esempio u v 1/8 F w 2/7 F 3/6 x y z u v w 1/8 2/7 B 9/ C 4/5 3/6 x y 10/ z u v w 2/7 9/12 B 2/7 F x y z u v w 1/8 2/7 x B 9/ C 3/6 y v 1/8 9/ B 3/6 4/5 u z B 2/7 B 9/ C 4/5 3/6 x y z u v w 1/8 2/7 F 10/ w B 9/ C 4/5 3/6 x y 10/11 z B C 4/5 3/6 x y I. Castelli w 4/5 F 1/8 F v 1/8 B 4/5 F u 10/11 z B Visita di un grafo, A.A. 2009/2010 26/44 Foresta DFS Allo stesso modo della ricerca BFS, nella ricerca DFS, un nodo v viene scoperto esplorando la lista di adiacenza di un nodo u già scoperto. L’array “p” tiene traccia del predecessore di ogni nodo scoperto: p[v] = u Foresta DFS L’array p definisce un sottografo dei predecessori di G. In particolare, si tratta di una foresta, Fp : Fp = (V, Ep ) Ep = {(p[v], v) : v ∈ V e p[v] 6= N IL} Il sottografo dei predecessori è una foresta depth first, costituita da più alberi depth first. I. Castelli Visita di un grafo, A.A. 2009/2010 27/44 Foresta DFS - Classificazione degli archi Gli archi del grafo originario vengono classificati in: Tree-edge. Archi della foresta DFS. Forward-edge. Archi in avanti. Archi non appartenenti alla foresta DFS, che vanno da un vertice ad un suo successore nella foresta DFS. Quando vengono percorsi durante l’algoritmo DFS, collegano due nodi già scoperti. Backward-edge. Archi all’indietro. Archi non appartenenti alla foresta DFS, che vanno da un vertice ad un suo antenato nella foresta DFS. Archi del grafo che, quando vengono percorsi durante l’algoritmo DFS, collegano due nodi già scoperti. Cross-edge Archi di attraversamento. Tutti gli altri archi. Collegano due nodi che non hanno una relazione di discendenza l’uno dall’altro. I. Castelli Visita di un grafo, A.A. 2009/2010 28/44 Foresta DFS p u v w 1/8 2/7 9/12 F B 3/6 x y v 9/12 w 2/7 v 10/11 z F u C w NIL C 4/5 u NIL 1/8 u 10/11 z B x y y v z w B B 3/6 y 4/5 x La struttura degli alberi DFS rispecchia esattamente la struttura delle chiamate ricorsive alla procedura DF S − V ISIT : u = p[v] se e solo se DF S − V ISIT (v) è stata chiamata durante lo scorrimento della lista di adiacenza di u. Nota: gli archi uscenti ed entranti sullo stesso nodo (self-loop), vengono considerati backward-edge. I. Castelli Visita di un grafo, A.A. 2009/2010 29/44 Algoritmo DFS - Analisi 1 Nella procedura DF S ci sono due cicli, che vengono eseguiti Θ(| V |) 2 La procedura DF S − V ISIT viene richiamata esattamente una volta per ogni nodo v ∈ V 3 Durante l’esecuzione di DF S − V ISIT (u), il ciclo nelle linee 5-8 viene eseguito |Adj[u]| volte 4 Poiché X | Adj[v] |= Θ(| E |) v∈V il costo totale per l’esecuzione del ciclo è Θ(| E |) Il tempo totale di esecuzione è Θ(| V | + | E |) I. Castelli Visita di un grafo, A.A. 2009/2010 30/44 Algoritmo DFS - Proprietà Teorema delle parentesi In una visita in profondità di un grafo (diretto o non diretto) G = (V, E), per ogni coppia di nodi u e v, definiamo gli intervalli A = [d[u], f [u]] B = [d[v], f [v]] Allora, una e una sola delle seguenti condizioni è vera: 1 A∩B =∅ 2 L’intervallo A è interamente incluso nell’intervallo B, e u è un discendente di v in un albero DFS 3 L’intervallo B è interamente incluso nell’intervallo A, e v è un discendente di u in un albero DFS I. Castelli Visita di un grafo, A.A. 2009/2010 31/44 Algoritmo DFS - Proprietà Dimostrazione 1 Caso 1. d[u] < d[v]. Ci sono due sottocasi: 1 d[v] < f [u] F F F F F u viene scoperto prima di v Quando si scopre v la visita di u non è stata completata (u è grigio) Ciò vuol dire che v è discendente di u Poiché v è stato scoperto più recentemente di u, la visita di v deve completarsi prima di tornare a u: f [v] < f [u] QUindi l’intervallo A = [d[u], f [u]] è completamente contenuto in B = [d[v], f [v]] d[u] I. Castelli d[v] f[v] Visita di un grafo, A.A. 2009/2010 f[u] 32/44 Algoritmo DFS - Proprietà 1 2 d[v] > f [u] F F F F u diventa nero prima che v venga scoperto Quindi, quando v viene scoperto la visita di u è già stata completata d[v] < f [v] e d[u] < f [u] Quindi gli intervalli A = [d[u], f [u]] e B = [d[v], f [v]] sono disgiunti d[u] 2 I. Castelli f[u] d[v] f[v] Caso 2. d[u] > d[v]: è simmetrico, basta scambiare il ruolo di u e v Visita di un grafo, A.A. 2009/2010 33/44 Algoritmo DFS - Proprietà 1 2 d[v] > f [u] F F F F u diventa nero prima che v venga scoperto Quindi, quando v viene scoperto la visita di u è già stata completata d[v] < f [v] e d[u] < f [u] Quindi gli intervalli A = [d[u], f [u]] e B = [d[v], f [v]] sono disgiunti d[u] 2 f[u] d[v] f[v] Caso 2. d[u] > d[v]: è simmetrico, basta scambiare il ruolo di u e v Corollario (consegue dal teorema delle parentesi) Un nodo v è un discendente di un nodo u in un albero della foresta DFS per un grafo (diretto o non diretto) G se e solo se d[u] < d[v] < f [v] < f [u] I. Castelli Visita di un grafo, A.A. 2009/2010 33/44 Algoritmo DFS - Proprietà 1/8 u 9/12 w 2/7 v 10/11 z u w v z F C B B y 3/6 y x 4/5 x 1 I. Castelli 2 3 4 Visita di un grafo, A.A. 2009/2010 5 6 7 8 9 10 11 12 34/44 Algoritmo DFS - Un altro esempio y z s t 3/6 2/9 1/10 11/16 B C 4/5 s t 11/16 C z B F 2/9 C v s B v t z v u 14/15 C y 7/8 w x C I. Castelli u w 3/6 x 4/5 B C 14/15 u 12/13 y C C 12/13 7/8 w x 1/10 F 1 2 3 4 5 6 Visita di un grafo, A.A. 2009/2010 7 8 9 10 11 12 13 14 15 16 35/44 Algoritmo DFS - Proprietà Teorema del cammino bianco In una foresta DFS, un nodo v è discendente di u se e solo se al tempo d[u] (in cui la visita scopre u), il vertice v è raggiungibile da u con un cammino contenente esclusivamente nodi bianchi. d[u]/ v’ I. Castelli Visita di un grafo, A.A. 2009/2010 v 36/44 Algoritmo DFS - Classificazione degli archi L’algoritmo DFS può essere modificato in modo da effettuare una classificazione degli archi. Ogni arco può essere classificato in funzione del colore del vertice che raggiunge, quando viene percorso per la prima volta: Archi bianchi. Quelli appartenenti a un albero DFS. Archi grigi. Archi backward. Uniscono due nodi grigi durante la visita DFS. Archi neri. Archi forward (se d[u] < d[v]) oppure crossward (se d[u] > d[v]). Nota: in un grafo non diretto ci possono essere ambiguità perché (u, v) e (v, u) sono lo stesso arco. In tal caso l’arco viene classificato come l’arco orientata (u, v) oppure (v, u), a seconda della direzione in cui viene percorso per la prima volta. I. Castelli Visita di un grafo, A.A. 2009/2010 37/44 Algoritmo DFS - Classificazione degli archi Teorema Se G è un grafo non orientato, allora ogni arco è un tree-edge oppure un backward-edge. Dimostrazione. Sia (u, v) un arco arbitrario Supponiamo d[u] < d[v] (senza perdita di generalità) Allora si verifica uno di questi due casi: 1 2 I. Castelli (u, v) viene visitato a partire da u, con u grigio e v bianco. In tal caso è un tree-edge. (u, v) viene visitato a partire da v, con v e u entrambi grigi. In tal caso è un backward-edge. Visita di un grafo, A.A. 2009/2010 38/44 Algoritmo DFS - Classificazione degli archi Lemma Un grafo diretto è aciclico se e solo se l’algoritmo DFS non determina l’esistenza di backward-edge Dimostrazione. 1 =⇒. Se (u, v) è un arco all’indietro, allora v è un antenato di u nella foresta DFS. Quindi, esiste un cammino da v a u in G, e l’arco backward (u, v) completa il ciclo. 2 ⇐=. Si suppone che G abbia un ciclo c. Sia v il primo vertice del ciclo ad essere scoperto, e sia (u, v) l’arco che lo precede nel ciclo. Al tempo d[v] tutti i nodi da v a u sono bianchi (v grigio). Per il teorema dei cammini bianchi u sarà un discendente di v. Quindi, (u, v) è necessariamente un backward-edge. x B y z u I. Castelli v Visita di un grafo, A.A. 2009/2010 39/44 Ordinamento topologico L’algoritmo DFS può essere usato per effettuare un ordinamento topologoco dei nodi di un grafo diretto aciclico (DAG - Direct Acyclic Graph). Ordinamento topologico Un ordinamento topologico di un DAG G = (V, E) è un ordinamento lineare dei suoi vertici tale che, se G contiene un arco (u, v), allora u compare prima di v nell’ordinamento. Se il grafo contenesse dei cicli, un ordinamento di questo tipo non sarebbe possibile. I. Castelli Visita di un grafo, A.A. 2009/2010 40/44 Ordinamento topologico 1 4 I. Castelli 2 1 3 4 2 4 1 3 2 1 4 3 2 3 Visita di un grafo, A.A. 2009/2010 41/44 Ordinamento topologico 1 2 3 4 5 6 TOPOLOGICAL−SORT(G) Chiama DFS(G) p e r c a l c o l a r e i t e m p i d i f i n e v i s i t a f [ v ] per ogni v e r t i c e v Appena l a v i s i t a d i un nodo e ’ finita , inseriscilo in testa a una lista concatenata Restituisci la lista concatenata dei nodi Supponendo che s = 2 e Adj[s] = 4 → 3 → 1 1 2 4 3 f [2] > f [1] > f [3] > f [4] 2 1 3 4 Nota: l’ordinamento topologico ottenuto varia a seconda della sorgente scelta, e dall’ordine dei nodi nelle liste Adj I. Castelli Visita di un grafo, A.A. 2009/2010 42/44 Ordinamento topologico Teorema T OP OLOGICAL − SORT (G) produce un ordinamento topologico di un grafo orientato aciclico G Dimostrazione. È sufficiente dimostrare che per ogni coppia di vertici u, v ∈ V , se esiste un arco (u, v), allora f [v] < f [u] Poiché il grafo è aciclico, non esistono backward-edge (archi grigi). Quindi (u, v) può essere: 1 2 I. Castelli un arco bianco (tree-edge). In tal caso v è bianco e diventa discendente di u e, per il teorema delle parentesi, f [v] < f [u] un arco nero (forward-edge oppure cross-edge). In tal caso v è nero e f [v] < f [u] perché v è già diventato nero prima di aver concluso la visita di u. Visita di un grafo, A.A. 2009/2010 43/44 Ordinamento topologico - Analisi DF S(G) richiede tempo Θ(| V | + | E |) L’inserimento di ognuno dei | V | nodi nella lista richiede tempo costante. L’ordinamento topologico richiede tempo Θ(| V | + | E |) I. Castelli Visita di un grafo, A.A. 2009/2010 44/44