Algoritmi di visita Scopo: visitare tutti i vertici di un grafo per scoprirne proprietà di vario tipo. Alcune applicazioni degli algoritmi di visita: • scoprire tutti i vertici raggiungibili da un determinato vertice • verificare se il grafo contiene cicli • verificare se un grafo è (fortemente) connesso • quali sono le componenti (fortemente) connesse di un grafo • se un grafo non orientato è bipartito (cioè se è possibile suddividere i vertici in due classi tali che non ci siano archi che collegano vertici che stanno nella medesima classe) • ordinamento totale dei vertici in un DAG che rispetti i vincoli di precedenza (ordinamento topologico) Master Bioinformatica 2002: Visite di Grafi Due tipi di visita Cominciando a esplorare il grafo a partire una sorgente, intuitivamente: • Visita in ampiezza: si scoprono prima tutti i vertici che sono a distanza n (numero di archi) dalla sorgente prima di scoprire quelli che sono a distanza n+1 • Visita in profondità: si scoprono sempre prima gli adiacenti dell’ultimo adiacente scoperto prima di scoprire tutti gli altri Master Bioinformatica 2002: Visite di Grafi 1 4 a d 3 c b 2 6 7 e f 9 5 g h i 8 Possibile ordine di visita scoperto dalla visita in ampiezza a, d, c, b, g, f, e, i, h Master Bioinformatica 2002: Visite di Grafi 1 2 a d 9 c b 7 6 3 e f 4 8 g h i 5 Possibile ordine di visita scoperto dalla visita in profondità a, b, e, h, i, f, d, g, c Master Bioinformatica 2002: Visite di Grafi Algoritmi di visita Possono essere visti come realizzazioni di un unico algoritmo astratto. Dividiamo l’insieme dei vertici in tre insiemi colorati in modo diverso Bianco: Vertici non ancora visitati o “scoperti” Grigio: Vertici visitati i cui adiacenti non sono ancora stati tutti scoperti, quindi vertici utili per continuare la visita Nero: Vertici visitati e non più utili per continuare a scoprire altri vertici (i loro adiacenti sono stati tutti già scoperti) Master Bioinformatica 2002: Visite di Grafi INIZIALIZZA (G) for ogni u V do color u white Complessità: O (V) VISITA (G, s) color s gray while ci sono vertici grigi do u un vertice grigio if c’è v bianco adiacente a u then color v gray else color u black Complessità O(V+E) se si scandiscono gli adiacenti di un vertice una volta sola Master Bioinformatica 2002: Visite di Grafi Proprietà 1: Il colore di un vertice può solo passare da “white” a “gray” a “black”. Invarianti del while: INV1: Se (u,v) E[G] e u è nero, allora v è o grigio o nero. INV2: Tutti i vertici grigi o neri sono raggiungibili da s. INV3: Qualunque cammino da s a un vertice bianco deve contenere almeno un vertice grigio. Dimostrazione. Se s è grigio: vero. Se s è nero: se non ci fosse nessun vertice grigio ci sarebbe un vertice bianco adiacente ad uno nero, che è impossibile per l'invariante INV1. Master Bioinformatica 2002: Visite di Grafi Teorema. Al termine dell'algoritmo di visita, un vertice è nero se e solo se è raggiungibile da s. Dimostrazione. () Per INV2 all'uscita del while tutti i vertici neri sono raggiungibili da s. () Da INV3 e dalla condizione di uscita del ciclo (non ci sono vertici grigi) si ricava che non ci può essere nessun vertice bianco raggiungibile da s. Master Bioinformatica 2002: Visite di Grafi L’algoritmo può essere modificato in modo da ricordare, per ogni vertice che viene scoperto, quale vertice grigio ha permesso di visitarlo, ossia ricordare l’arco percorso. Ad ogni vertice u si associa un attributo P[u] che rappresenta il vertice (predecessore) che ha permesso di scoprirlo. L’algoritmo di inizializzazione deve essere esteso per inizializzare P: INIZIALIZZA (G) for ogni vertice u V[G] do color [u] white P[u] NULL Master Bioinformatica 2002: Visite di Grafi VISITA (G, s) color [s] gray while ci sono vertici grigi do scegli un vertice grigio u if esiste un vertice bianco v adiacente a u then color [v] gray P[v] u else color [u] black Proprietà 2: Al termine dell'esecuzione di VISITA (G,s) tutti e soli i vertici neri diversi da s hanno un predecessore diverso da NULL. Master Bioinformatica 2002: Visite di Grafi Sottografo dei predecessori GP =(VP, EP): VP = {v V: P [v] NULL} {s} EP = {(P[v], v) E: v VP -{s}} Come conseguenza immediata della Proprietà 2, al termine dell'esecuzione di VISITA (G,s) VP è l'insieme di tutti i vertici neri, cioè di tutti i vertici raggiungibili da s. Teorema. Il sottografo dei predecessori costruito dall'algoritmo di visita è un albero. Dimostrazione. Basta dimostrare che è invariante del while la seguente proprietà: <VP, EP> è connesso e |EP| = |VP| - 1. Master Bioinformatica 2002: Visite di Grafi In certe applicazioni può essere necessario visitare tutti i vertici di un grafo. Questo può essere fatto nel modo seguente: VISITA_TUTTI_I_VERTICI (G) INIZIALIZZA (G) for ogni u V do if color u = white then VISITA (G, u) Master Bioinformatica 2002: Visite di Grafi Per gestire l'insieme dei vertici grigi in modo efficiente, si può utilizzare una struttura dati D i cui elementi siano ordinati, e su cui sono definite le operazioni: make_empty crea una struttura vuota first (D) restituisce il primo elemento di D (senza modificare D) add (D, x) aggiunge l'elemento x a D remove-first (D) toglie da D il primo elemento not_empty (D) restituisce true se D non è vuota e false altrimenti •Se add (D,x) aggiunge x come ultimo elemento di D, D è una CODA. •Se add (D,x) aggiunge x come primo elemento di D, D è una PILA (STACK); Master Bioinformatica 2002: Visite di Grafi L'algoritmo diventa: VISITA (G, s) D make_empty color s gray add (D, s) while not_empty (D) do u first (D) if c’è v bianco adiacente a u then color v gray add (D, v) else color u black remove_first (D) Master Bioinformatica 2002: Visite di Grafi Visita in ampiezza Breadth-First-Search (BFS) La struttura dati D è una CODA Master Bioinformatica 2002: Visite di Grafi B A F C E G A B D Q H A B D head Master Bioinformatica 2002: Visite di Grafi D B A F C E G A B D Q H B D C F head Master Bioinformatica 2002: Visite di Grafi C D F B A F C E G A B D Q H D C F H head Master Bioinformatica 2002: Visite di Grafi C D F H B A F C E G A B D Q H C F H E head Master Bioinformatica 2002: Visite di Grafi C E D F H B A F C E G A B D Q H F H E G head Master Bioinformatica 2002: Visite di Grafi D C F E G H B A F C E G A B D Q H H E G head Master Bioinformatica 2002: Visite di Grafi D C F E G H B A F C E G A B D Q H E G head Master Bioinformatica 2002: Visite di Grafi D C F E G H B A F C E G A B D Q H G head Master Bioinformatica 2002: Visite di Grafi D C F E G H B A F C E G A B D H Q head Master Bioinformatica 2002: Visite di Grafi D C F E G H BFS-VISITA (G, s) Q make_empty color s gray enqueue (Q, s) while not_empty (Q) do u head (Q) if c’è v bianco adiacente a u then color v gray P[v u enqueue (Q, v) else color u black dequeue (Q) Poichè la head della coda non cambia finché ci sono adiacenti bianchi, l'algoritmo può essere modificato nel modo seguente: while c’è un v adiacente a u non considerato do if color v = white then color v gray P[v u enqueue (Q, v) color u black dequeue (Q) Master Bioinformatica 2002: Visite di Grafi N.B. Nella visita in ampiezza Breadth First Search l’albero viene costruito a livelli A B D C F E G H Possiamo riscrivere l’algoritmo associando ad ogni vertice ‘v’ un attributo ‘d[v]’, che ricorda il suo livello nell’albero ottenuto con la visita. Master Bioinformatica 2002: Visite di Grafi Inizializzazione per il calcolo delle distanze INIZIALIZZA (G) for ogni u V do color u white P[u NULL du Master Bioinformatica 2002: Visite di Grafi BFS-VISITA (G, s) Q make_empty color s gray d[s] 0 enqueue (Q, s) while not_empty (Q) do u head (Q) while c’è v adiacente a u non considerato do if color v = white then color v gray P[v u dv d[u] + 1 enqueue (Q, v) color u black dequeue (Q) Master Bioinformatica 2002: Visite di Grafi Liste di adiacenza in ordine alfabetico A B D B A C C D E B E A H F G B H D F C G F Master Bioinformatica 2002: Visite di Grafi Liste di adiacenza in ordine alfabetico inverso A D B B F C C D E E B H A F G G H D A C B F Master Bioinformatica 2002: Visite di Grafi B F C A E G H D Vertici memorizzati nelle liste Vertici memorizzati nelle liste di adiacenza in ordine inverso di adiacenza in ordine alfabetico A B A D C F E G B D H C H G E Master Bioinformatica 2002: Visite di Grafi F A A B D D C F E G G H C H G B F E Teorema Al termine di una BFS-VISITA si ha: vV[G] : d[v] = (s, v). (s, v) indica la distanza di v dal vertice sorgente (lunghezza di un cammino minimo da s a v). Master Bioinformatica 2002: Visite di Grafi Proprietà 4 • In Q ci sono tutti e soli i vertici grigi • 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: d[v] = (s,v) per tutti i vertici v grigi o neri. Dimostrazione È sufficiente dimostrare che l’assegnazione d[v] d[u] + 1 rende d[v] = (s,v); la dimostrazione del lemma è una ovvia conseguenza di questo fatto. Master Bioinformatica 2002: Visite di Grafi 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 la Proprietà 4, 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ò avere lunghezza minore di quella di un cammino minimo, allora (s,v) = d[u] + 1 e l’assegnazione d[v] d[u] + 1 rende d[v] = (s,v). Master Bioinformatica 2002: Visite di Grafi 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. • Il livello di un vertice nell’albero è indipendente dall’ordine in cui sono memorizzati i vertici nelle liste di adiacenza. Master Bioinformatica 2002: Visite di Grafi