Visita in profondità o
Depth-First-Search (DFS)
La struttura dati D è una PILA (STACK)
Master Bioinformatica 2002: Visite di Grafi
B
H
C
A
D
A
G
B
C
E
S
H
G
F
D
C
B
A
F
D
F
G
H
Master Bioinformatica 2002: Visite di Grafi
B
H
C
A
D
AA
G
B
C
E
S
H
G
F
D
C
B
A
F
D
F
G
H
Master Bioinformatica 2002: Visite di Grafi
B
H
C
A
D
AA
G
B
C
E
F
D
F
S
F
D
C
B
A
G
H
Master Bioinformatica 2002: Visite di Grafi
B
H
C
A
D
AA
G
B
C
E
S
E
F
D
C
B
A
F
D
F
G
H
Master Bioinformatica 2002: Visite di Grafi
G
E
B
H
C
A
D
AA
G
B
C
E
F
D
F
S
F
D
C
B
A
G
H
Master Bioinformatica 2002: Visite di Grafi
G
E
B
H
C
A
D
AA
G
B
C
E
F
D
F
S
D
C
B
A
G
H
Master Bioinformatica 2002: Visite di Grafi
G
E
B
H
C
A
D
AA
G
B
C
E
F
D
F
S
C
B
A
G
H
Master Bioinformatica 2002: Visite di Grafi
E
B
H
C
A
D
AA
G
B
C
E
F
D
F
G
S
B
A
H
Master Bioinformatica 2002: Visite di Grafi
E
B
H
C
A
D
AA
G
B
C
E
F
D
F
G
S
A
H
Master Bioinformatica 2002: Visite di Grafi
E
B
H
C
A
D
AA
G
B
C
E
F
D
F
G
H
S
Master Bioinformatica 2002: Visite di Grafi
E
Vertici memorizzati nelle liste di adiacenza in ordine alfabetico:
CONSIDERIAMO L’ORDINE IN CUI I VERTICI
DIVENTANO GRIGI: viene creato l’albero
1
AA 8
2
B
7
3
C
6
4
D
5
5
F
4
E L’ORDINE IN CUI DIVENTANO NERI
B
1
A
7
2
H
3
8E
C
D
G
6
4
5
F
6 G 2 8
7
Master Bioinformatica 2002: Visite di Grafi
H 1
E 3
1 A 16
Usando un unico contatore si ottiene:
B
1
A
2 7
8
3
8
2 B 15
3
E
7
C
6
D
4
5
5
1
H
6
3 C 14
G
2
4 D 13
5 F 12
4F
6 G 9
7 H 8
Master Bioinformatica 2002: Visite di Grafi
10 E 11
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
Seconda versione con ciclo sugli adiacenti sul top dello stack
top(S)
cambia
ogni volta
che viene
aggiunto
un vertice
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)
color top(S)  black
pop (S)
Master Bioinformatica 2002: Visite di Grafi
D
A
A
C
B
D
B
F
C
E
F
C
F
B
S
D
A
Master Bioinformatica 2002: Visite di Grafi
D
A
A
C
B
D
B
F
E
F
E
F
B
S
D
A
Master Bioinformatica 2002: Visite di Grafi
C
C
E
D
A
A
C
B
D
B
F
E
F
C
E
F
B
S
D
A
Master Bioinformatica 2002: Visite di Grafi
C
C
E
E
D
A
A
C
B
D
B
F
C
C
E
E
E
F
C
E
F
B
S
D
A
Master Bioinformatica 2002: Visite di Grafi
F
D
A
A
C
B
D
B
F
C
C
E
E
E
F
F
B
S
D
A
Master Bioinformatica 2002: Visite di Grafi
D
A
A
C
B
D
B
F
C
C
E
E
E
F
F
B
D
S
A
Master Bioinformatica 2002: Visite di Grafi
D
A
A
D
C
B
B
F
C
C
E
E
E
F
F
B
D
A
S
Master Bioinformatica 2002: Visite di Grafi
Osservazione
A
D
B
F
Gli intervalli di “attivazione” di due
vertici sono:
• disgiunti
• uno interamente contenuto
C
C
E
E
nell’altro
F
B
D
A
Master Bioinformatica 2002: Visite di Grafi
un vertice non viene “disattivato”
finchè non sono stati ‘attivati”e
poi “disattivati” tutti i suoi discendenti
1 A 12
2 D 11
3 B 10
è l’ordine in cui si percorre l’albero
delle chiamate ricorsive di una
procedura ricorsiva
4 F 9
5 C 6
7 E 8
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 è <v1, v2, ..., vr> (con
v1= s e vr sul top), la corrispondente sequenza di
attivazioni per la procedura ricorsiva sarà:
<DFS-visit (G,v1), ..., DFS-visit (G,vr)>.
Master Bioinformatica 2002: Visite di Grafi
D
DFS-ric(G,A)
A
C
B
DFS-ric(G,D)
DFS-ric(G,B)
DFS-ric(G,F)
E
F
DFS-ric(G,C)
C
F
B
S
D
A
Master Bioinformatica 2002: Visite di Grafi
D
DFS-ric(G,A)
A
C
B
DFS-ric(G,D)
DFS-ric(G,B)
DFS-ric(G,F)
E
F
DFS-ric(G,C)
C
F
B
S
D
A
Master Bioinformatica 2002: Visite di Grafi
D
DFS-ric(G,A)
A
C
B
DFS-ric(G,D)
DFS-ric(G,B)
DFS-ric(G,F)
E
F
F
B
S
D
A
Master Bioinformatica 2002: Visite di Grafi
D
DFS-ric(G,A)
A
C
B
DFS-ric(G,D)
DFS-ric(G,B)
DFS-ric(G,F)
E
F
DFS-ric(G,E)
E
F
B
S
D
A
Master Bioinformatica 2002: Visite di Grafi
D
DFS-ric(G,A)
A
C
B
DFS-ric(G,D)
DFS-ric(G,B)
DFS-ric(G,F)
E
F
F
B
S
D
A
Master Bioinformatica 2002: Visite di Grafi
D
DFS-ric(G,A)
A
C
B
DFS-ric(G,D)
DFS-ric(G,B)
E
F
S
B
D
A
Master Bioinformatica 2002: Visite di Grafi
D
DFS-ric(G,A)
A
C
B
DFS-ric(G,D)
E
F
S
D
A
Master Bioinformatica 2002: Visite di Grafi
D
DFS-ric(G,A)
A
C
B
E
F
S
A
Master Bioinformatica 2002: Visite di Grafi
D
A
C
B
E
F
S
Master Bioinformatica 2002: Visite di Grafi
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
time  time + 1
d[u]  time
while c’è v adiacente a u non considerato do
if color v = white
then P[v  u
DFS-VISITA-ricorsiva (G, v)
time  time + 1
f[u]  time
color u  black
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:
 d[u] < d[v] < f[v] < f[u] e u è un antenato di v in un albero
della foresta DFS
 d[v] < d[u] < f[u] < f[v] e u è un discendente di v in un albero
della foresta DFS
 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
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
Arco di attraversamento: arco che collega due vertici che non sono
in relazione antenato - discendente
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:
• bianco: (u, v) è un arco dell’albero
• 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]
Master Bioinformatica 2002: Visite di Grafi
(Vertici adiacenti scanditi in ordine alfabetico)
A
B
D
C
E
Master Bioinformatica 2002: Visite di Grafi
(Vertici adiacenti scanditi in ordine alfabetico)
1
A
B
D
C
E
Master Bioinformatica 2002: Visite di Grafi
(Vertici adiacenti scanditi in ordine alfabetico)
1
A
2
B
D
C
E
Master Bioinformatica 2002: Visite di Grafi
(Vertici adiacenti scanditi in ordine alfabetico)
1
A
2
3
B
D
C
E
Master Bioinformatica 2002: Visite di Grafi
(Vertici adiacenti scanditi in ordine alfabetico)
1
(D, A) arco all’indietro
A
2
3 4
B
D
C
E
Master Bioinformatica 2002: Visite di Grafi
(Vertici adiacenti scanditi in ordine alfabetico)
1
(D, A) arco all’indietro
A
2 5
3 4
B
D
C
E
Master Bioinformatica 2002: Visite di Grafi
(Vertici adiacenti scanditi in ordine alfabetico)
1
(D, A) arco all’indietro
A
2 5
3 4
B
D
C
6
E
Master Bioinformatica 2002: Visite di Grafi
(D, A) arco all’indietro
1
(C, B) arco di attraversameto
A
2 5
3 4
B
D
C
6
E
Master Bioinformatica 2002: Visite di Grafi
(D, A) arco all’indietro
1
(C, B) arco di attraversameto
A
2 5
3 4
B
D
6
C
E
7
Master Bioinformatica 2002: Visite di Grafi
(D, A) arco all’indietro
(C, B) arco di attraversameto
1
(E, D) arco di attraversameto
A
2 5
3 4
B
D
C
6
E
7 8
Master Bioinformatica 2002: Visite di Grafi
(D, A) arco all’indietro
(C, B) arco di attraversameto
1
(E, D) arco di attraversameto
A
2 5
3 4
B
D
C
E
69
7 8
Master Bioinformatica 2002: Visite di Grafi
(D, A) arco all’indietro
(C, B) arco di attraversameto
1 10
(E, D) arco di attraversameto
A
(A, E) arco in avanti
2 5
3 4
B
D
C
E
6 9
7 8
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
calze
orologio
pantaloni
scarpe
camicia
cintura
cravatta
giacca
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
Master Bioinformatica 2002: Visite di Grafi
Scarica

Visita in profondita