Master Bioinformatica 2002: Visite di Grafi La struttura dati D è una PILA (STACK) Visita in profondità o Depth-First-Search (DFS)
Master Bioinformatica 2002: Visite di Grafi B A B D C F H G A B C D F G H S A C E D H G F
A C E D H G F A B C D F G H A B C D F G H B A B C D F G H S A C E D H G F
B A B C D F S A C E D H G F A B C D F G H A B C D F G H
B A B C D F E S H A C E D G F A B C D F H A B C D F GG H GE
B A B C D F S H A C E D G F A B C D F H A B C D F GG H GE
B H A B C D S A C E D G F A B C D F H A B C D F GG H GE
A B C S B A C E D H G F A B C D F G H A B C D F G H E
A B S B A C E D H G F A B C D F G H A B C D F G H E
A S A B C D F G H A B C D F G H E B A C E D H G F
S A B C D F G H A B C D F G H E B A C E D H G F
A B C D F G H A B C D F G H E Vertici memorizzati nelle liste di adiacenza in ordine alfabetico: B A C E D H G F CONSIDERIAMO L’ORDINE IN CUI I VERTICI DIVENTANO GRIGI: viene creato l’albero E L’ORDINE IN CUI DIVENTANO NERI
Master Bioinformatica 2002: Visite di Grafi B A C E D H G F A B C D F G H E Usando un unico contatore si ottiene:
Master Bioinformatica 2002: Visite di Grafi Visita DFS (prima versione) DFS-VISITA (G, s) S make_empty_stack color s gray push (S, s) while not_empty (S) do u top (S) if c’è v bianco adiacente a u then color v gray P[v u push (S, v) else color u black pop (S)
Master Bioinformatica 2002: Visite di Grafi DFS-VISITA (G, s) S make_empty_stack color s gray push (S, s) while not_empty (S) do while c’è un v adiacente a top (S) non considerato do if color v = white then color v gray P[v top(S) push (S, v) Seconda versione con ciclo sugli adiacenti sul top dello stack top(S) cambia ogni volta che viene aggiunto un vertice color top(S) black pop (S)
Master Bioinformatica 2002: Visite di Grafi A D B F B C A E D F C C A D B F S
D A D B F B C A E F C A D B F S E C E
D A D B F B C A E F C C A D B F S E C E E
D A D B F B C A E F C C A D B F S E C E E F
F B C A E D A B F C A D S C E E F B D
F B C A E D A B F C A D S C E E F B D
F B C A E D B F C A D S C E E F B D A
B F B F C C E E A D D A Gli intervalli di “attivazione” di due vertici sono: disgiunti uno interamente contenuto nell’altro Osservazione
Master Bioinformatica 2002: Visite di Grafi D B F CE A un vertice non viene “disattivato” finchè non sono stati ‘attivati”e poi “disattivati” tutti i suoi discendenti è l’ordine in cui si percorre l’albero delle chiamate ricorsive di una procedura ricorsiva Versione ricorsiva dell’algoritmo di visita in profondità
Master Bioinformatica 2002: Visite di Grafi DFS-VISITA-ricorsiva (G, u) color u gray while c’è v adiacente a u non considerato do if color v = white then P[v u DFS-VISITA-ricorsiva (G, v) color u black
Master Bioinformatica 2002: Visite di Grafi C'è corrispondenza fra lo stack della procedura iterativa e lo stack delle attivazioni della procedura ricorsiva. Più precisamente, supponendo che gli adiacenti vengano visitati nello stesso ordine dalle due procedure, se ad un certo punto dell'esecuzione lo stack della procedura iterativa è (con v 1 = s e v r sul top), la corrispondente sequenza di attivazioni per la procedura ricorsiva sarà:.
Master Bioinformatica 2002: Visite di Grafi A D B F B C A E D F C SDFS-ric(G,B) DFS-ric(G,D) DFS-ric(G,A) DFS-ric(G,F) DFS-ric(G,C)
Master Bioinformatica 2002: Visite di Grafi D A D B F B C A E F S C DFS-ric(G,B) DFS-ric(G,D) DFS-ric(G,A) DFS-ric(G,F) DFS-ric(G,C)
Master Bioinformatica 2002: Visite di Grafi D A D B F B C A E F SDFS-ric(G,B) DFS-ric(G,D) DFS-ric(G,A) DFS-ric(G,F)
Master Bioinformatica 2002: Visite di Grafi D A D B F B C A E F S E DFS-ric(G,B) DFS-ric(G,D) DFS-ric(G,A) DFS-ric(G,F) DFS-ric(G,E)
Master Bioinformatica 2002: Visite di Grafi D A D B F B C A E F SDFS-ric(G,B) DFS-ric(G,D) DFS-ric(G,A) DFS-ric(G,F)
Master Bioinformatica 2002: Visite di Grafi D A D B F B C A E SDFS-ric(G,B) DFS-ric(G,D) DFS-ric(G,A)
Master Bioinformatica 2002: Visite di Grafi D A D F B C A E S DFS-ric(G,D) DFS-ric(G,A)
Master Bioinformatica 2002: Visite di Grafi D A F B C A E S DFS-ric(G,A)
Master Bioinformatica 2002: Visite di Grafi D F B C A E S
DFS con calcolo dei tempi di inizio e fine visita Introduciamo un contatore “time” per ricordare l’ordine delle attivazioni e disattivazioni e i due attributi d (attivazione) e f (disattivazione) INIZIALIZZA (G) for ogni u V do color u white P[u nil d[u] f[u] time 0 N.b. Se un vertice non viene “visitato” i suoi tempi di attivazione e disattivazione resteranno infiniti.
Master Bioinformatica 2002: Visite di Grafi DFS-VISITA-ricorsiva (G, u) color u gray while c’è v adiacente a u non considerato do if color v = white then P[v u DFS-VISITA-ricorsiva (G, v) color u black time time + 1 f[u] time time time + 1 d[u] time
Master Bioinformatica 2002: Visite di Grafi Proprietà della visita in profondità : 1. Teorema delle parentesi In ogni visita DFS di un grafo (orientato o non orientato), per ogni coppia di vertici u, v una e una sola delle seguenti condizioni è soddisfatta: u d[u] < d[v] < f[v] < f[u] e u è un antenato di v in un albero della foresta DFS u d[v] < d[u] < f[u] < f[v] e u è un discendente di v in un albero della foresta DFS u d[u] < f[u] < d[v] < f[v] e tra u e v non esiste relazione di antenato - discendente
Master Bioinformatica 2002: Visite di Grafi Classificazione degli archi del grafo durante una DFS Arco di attraversamento: arco che collega due vertici che non sono in relazione antenato - discendente DEFINIZIONE Arco dell’albero: arco inserito nella foresta DFS Arco all’indietro: arco che collega un vertice ad un suo antenato in un albero della foresta DFS Arco in avanti: arco che collega un vertice ad un suo discendente in un albero della foresta DFS
Master Bioinformatica 2002: Visite di Grafi OSSERVAZIONE un arco (u, v) viene “percorso” quando si scopre v nella lista degli adiacenti ad u. In quel momento color[v] può essere: grigio: v è un antenato di u in un albero della foresta DFS, (u, v) è un arco all’indietro nero: la visita di v è già terminata, (u, v) è un arco in avanti se v è un discendente di u in tal caso d[u] < d[v] < f[v] < f[u] d[u] < d[v] di attraversamento altrimenti in tal caso d[v] < f[v] < d[u] < f[u] d[v] < d[u] bianco: (u, v) è un arco dell’albero
Master Bioinformatica 2002: Visite di Grafi (Vertici adiacenti scanditi in ordine alfabetico) D E BC A
Master Bioinformatica 2002: Visite di Grafi 1 D E BC A (Vertici adiacenti scanditi in ordine alfabetico)
Master Bioinformatica 2002: Visite di Grafi (Vertici adiacenti scanditi in ordine alfabetico) 1 D E BC A 2
Master Bioinformatica 2002: Visite di Grafi (Vertici adiacenti scanditi in ordine alfabetico) 1 D E BC A 2 3
Master Bioinformatica 2002: Visite di Grafi (Vertici adiacenti scanditi in ordine alfabetico) 1 D E BC A (D, A) arco all’indietro
Master Bioinformatica 2002: Visite di Grafi (Vertici adiacenti scanditi in ordine alfabetico) 1 D E BC A (D, A) arco all’indietro
Master Bioinformatica 2002: Visite di Grafi (Vertici adiacenti scanditi in ordine alfabetico) 1 D E BC A (D, A) arco all’indietro 6
Master Bioinformatica 2002: Visite di Grafi 1 D E BC A (D, A) arco all’indietro 6 (C, B) arco di attraversameto
Master Bioinformatica 2002: Visite di Grafi 1 D E BC A (D, A) arco all’indietro 6 7 (C, B) arco di attraversameto
Master Bioinformatica 2002: Visite di Grafi 1 D E BC A (D, A) arco all’indietro (E, D) arco di attraversameto (C, B) arco di attraversameto
Master Bioinformatica 2002: Visite di Grafi 1 D E BC A (D, A) arco all’indietro (E, D) arco di attraversameto (C, B) arco di attraversameto
Master Bioinformatica 2002: Visite di Grafi 1 10 D E BC A (D, A) arco all’indietro (E, D) arco di attraversameto (C, B) arco di attraversameto (A, E) arco in avanti
Master Bioinformatica 2002: Visite di Grafi Teorema In una visita DFS di un grafo non orientato, ogni arco è un arco dell’albero o un arco all’indietro. Teorema Un grafo, orientato o non orientato, è aciclico se e solo se una visita DFS (qualunque) non produce archi all’indietro.
Master Bioinformatica 2002: Visite di Grafi Ordinamento topologico di un DAG Un ordinamento topologico di un DAG G= (V, E) è un ordinamento di tutti i vertici tale che se c’è un arco (u, v) in E allora u precede v
Master Bioinformatica 2002: Visite di Grafi Semplici applicazioni degli algoritmi di visita Algoritmo che determina se un grafo orientato contiene un ciclo Algoritmo che determina se un grafo non orientato e’ connesso Algoritmo che conta le componenti connesse di un grafo non orientato Algoritmo che determina un ordinamento topologico di un DAG
Master Bioinformatica 2002: Visite di Grafi Esempio di DAG slip pantaloni cintura camicia cravatta giacca calze scarpe orologio
Master Bioinformatica 2002: Visite di Grafi Possibile ordinameto (non è unico) slip orologio calze pantaloni camicia scarpe cintura cravatta giacca
Master Bioinformatica 2002: Visite di Grafi Idea! In un DAG, al termine di una visita DFS vale per ogni arco (u,v) f(u) > f(v) Algoritmo: fai una visita DFS su tutto il grafo, dai in outpu l’elenco dei vertici ordinati per tempo f(u) di fine visita decrescente