……………………………………………………………………..
Grafi:
componenti fortemente connesse
“Che cosa” sono e “come” si calcolano
F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
Che cosa sono
le componenti fortemente connesse
(di un grafo orientato)
F. Damiani - Alg. & Lab. 04/05
Definizione di componenti fortemente connesse
Proprietà. In un grafo orientato G = (V,E), la relazione su V ×
V “mutuamente raggiungibile” è una relazione di equivalenza .
Definizione. Le componenti fortemente connesse di un
grafo orientato G = (V,E) sono le classi della relazione di
equivalenza su V × V “mutuamente raggiungibile”.
Notazione. Useremo la notazione u ≈FC v per indicare che i
vertici u e v sono nella stessa classe di equivalenza.
F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
Un algoritmo per il calcolo
delle componenti fortemente connesse
(di un grafo orientato)
F. Damiani - Alg. & Lab. 04/05
Calcolo della componente fortemente connessa di un vertice
Sia x un vertice di un grafo orientato G=(V,E).
1. Calcola i discendenti di x, ovvero l’insieme D(x) dei vertici di G
che sono raggiungibili da x.
2. Calcola gli antenati di x, ovvero l’insieme A(x) dei vertici di G
da cui x è raggiungibile.
3. Calcola l’intersezione di D(x) e D(y).
La complessità in tempo è O(|V| + |E|), infatti per il passo:
1. È sufficiente una visita a partire da x (costo O(|V| + |E|))
marcando opportunamente i vertici raggiunti.
2. e 3. È sufficiente calcolare il grafo trasposto di G, ovvero il
grafo in cui tutti gli archi sono invertiti, (costo O(|V| + |E|)) e
effettuare una visita a partire da x (costo O(|V| + |E|))
collezionando i vertici marcati al passo 1. F. Damiani - Alg. & Lab. 04/05
Calcolo di tutte le componenti fortemente connesse
Sia G=(V,E) un grafo orientato.
Per ogni vertice x di G non ancora marcato
calcola la componente fortemente connessa di x marcandone
tutti i vertici.
La complessità in tempo è O(|V|2 + |V| *|E|).
F. Damiani - Alg. & Lab. 04/05
Un altro algoritmo per il calcolo
delle componenti fortemente connesse
(di un grafo orientato)
F. Damiani - Alg. & Lab. 04/05
Due proprietà
Lemma 1. Se due vertici x, y di un grafo sono in una
stessa c.f.c., allora nessun cammino tra di
essi può abbandonare tale c.f.c.
Dimostrazione. Siano x e y t.c. x ≈FC y. Sia z t.c. esiste un cammino x → z → y.
Siccome y ≈FC x, esiste un cammino y → x. Quindi esiste un cammino z → y →
x e, per definizione di c.f.c., z ≈FC x.
Teorema 1. In una qualunque DFS di un grafo G orientato
tutti i vertici di una c.f.c. vengono collocati
in uno stesso albero.
Dimostrazione. Sia r il primo vertice di una data c.f.c. che viene scoperto nella DFS.
Poichè r è il primo, al momento della scoperta di r tutti gli altri vertici della c.f.c.
saranno bianchi. Inoltre, tutti i cammini da r agli altri vertici della c.f.c. conterranno
solo vertici bianchi (perchè, per il Lemma 1, non lasciano mai la c.f.c.). Allora, per il
Teorema del cammino bianco, tutti questi vertici saranno discendenti di r nell’albero
DFS.
F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
Esempio
Visitiamo il grafo a partire da A
A
D
B
A
D
E
C
B
E
C
F
F
Le c.f.c.del grafo sono tre: {A}, {D, B, C}, {E, F}
N.B. Nello stesso albero ci sono vertici di più componenti
fortemente connesse
F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
L’albero può essere “potato” in modo da separare le componenti
A
A
D
B
D
E
C
B
E
C
F
F
Si noti che questo è sempre possibile perchè se in un albero della
foresta u è discendente di v e u ≈FC v, allora ogni discendente t
di u, non può appartenere alla stessa componente fortemente
connessa cui appartiene v.
F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
Come identificare i sottoalberi che costituiscono una c.f.c.?
In realtà basterebbe trovare un “giusto” ordinamento per visitare
i vertici per ottenere immediatamente gli alberi separati.
Nell’esempio precedente
A
D
B
E
C
F
un ordine “giusto” potrebbe essere:
EFDBCA
F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
A
EFDBCA
D
B
E
C
F
Infatti una DFS del grafo, considerando i vertici nell’ordine
produce la foresta:
E
D
F
B
A
C
F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
Ma quell’ordine non ci è noto !
Torniamo allora all’idea di identificare, in ogni albero della
foresta costruita da una DFS sul grafo G, i sottoalberi che
costituiscono una c.f.c.
F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
Come identificare i sottoalberi che costituiscono una c.f.c.?
Una DFS su G verifica l’esistenza di cammini in una direzione.
Idea
Verifichiamo l’esistenza di quelli nell’altra direzione.
Un modo può essere quello di cercare i cammini nel grafo
trasposto
F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
Riprendiamo l’esempio e costruiamo il grafo trasposto
GT
G
A
A
D
D
E
C
B
F
B
E
C
F
Una DFS su GT considerando i vertici in ordine alfabetico
produce la seguente foresta:
A
B
E
C
F
D
F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
Anche sul grafo trasposto non tutte le DFS separano le
componenti fortemente connesse.
Infatti, visitando prima E e poi D, si avrebbe:
A
A
D
B
E
D
E
F
B
C
F
C
E le componenti non sono ancora separate !
F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
Idea (continua): nella seconda visita potremmo
trovare l’ordine di visita per i vertici sfruttando informazioni
che si possono ottenere durante la prima visita.
Dati due vertici x e y, quale visitare per primo nel grafo
trasposto?
Assumiamo x ≈FC y. Dopo la DFS sul grafo G si possono
presentare i seguenti due casi :
1. y è discendente di x in un albero della foresta (o viceversa
x è discendente di y)
2. x e y non sono uno discendente dell’altro (sono in alberi o
sottoalberi distinti della foresta)
F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
Consideriamo il caso 1.
y è discendente di x in un albero della foresta DFS(G)
u
x
y
Esiste in G un cammino da x a y, ma se x ≈FC y non
deve esistere il cammino da y a x in G, cioe` da x a y
in GT.
F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
Nel caso 2.
x e y non sono uno discendente dell’altro
x
y
puo`esistere un cammino da x a y (a causa di archi
di attraversamento), ma se x ≈FC y non deve esistere nessun
cammino da y a x in G, cioe` nessun cammino da x
a y in GT.
F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
In entrambi i casi allora sarà “sicuro” iniziare la visita di GT
da x perchè, se i vertici non sono nella stessa c.f.c., non
verranno collocati nello stesso albero.
Sembra allora che i vertici nella visita di GT debbano essere
considerati:
• dall’alto verso il basso, e
• da destra verso sinistra
F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
Osserviamo gli intervalli di attivazione dei due vertici
nel caso 1 si ha:
d[x]
d[y]
f[y]
f[x]
f[y]
d[x]
f[x]
nel caso 2 si ha:
d[y]
In entrambi i casi f[x] > f[y]
i vertici vanno considerati in ordine decrescente di
tempo di fine visita
F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
Un algoritmo per il calcolo delle componenti fortemente connesse
Dalle osservazioni precedenti ricaviamo il seguente algoritmo
Strongly-Connected-Components (G)
1. Visita G con l’algoritmo DFS-VISITA-TUTTI-I-VERTICI
e costruisci una lista dei vertici
in ordine decrescente dei tempi di fine visita
2. Costruisci GT
3. Visita GT con l’algoritmo DFS-VISITA-TUTTI-I-VERTICI
considerando, nel ciclo principale dell’algoritmo, i vertici
nell’ordine trovato al passo 1.
Complessita`: O(V+E)
F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
Dimostrazione della correttezza dell’algoritmo
Per dimostrare che l’algoritmo e` corretto abbiamo bisogno
del Teorema 1 (gia` dimostrato):
Teorema 1. In una qualunque DFS di un grafo G orientato
tutti i vertici di una c.f.c. vengono collocati
in uno stesso albero.
e dei seguenti lemmi:
Lemma 2. Un grafo orientato e il suo trasposto hanno
le stesse c.f.c.
Dimostrazione. Immediata dalla definizione di c.f.c.
Lemma 3. Sia A un albero ottenuto con la visita in profondita`
di GT, considerando i vertici in ordine decrescente
dei tempi di fine visita su G, e sia u la sua radice.
Per ogni vertice v discendente di u: v ≈FC u
F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
Lemma 3. Sia A un albero ottenuto con la visita in profondita`
di GT, considerando i vertici in ordine decrescente
dei tempi di fine visita su G, e sia u la sua radice.
Per ogni vertice v discendente di u: v ≈FC u
Dimostrazione.
Dimostriamo prima di tutto che ogni discendente di u in A è
anche un discendente di u in un albero della foresta costruita
dalla visita in profondita’ su G.
La dimostrazione e’ fatta per assurdo.
Consideriamo un cammino sull'albero A a partire dalla radice u;
sia v il primo vertice sul cammino per cui il lemma non vale e sia
w il suo predecessore sul cammino.
F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
u
A
w
v
Poiche’ v è il primo vertice per cui il lemma non vale, l'enunciato
vale per w, e quindi:
d[u] ≤ d[w] < f[w] ≤ f[u] (w può anche essere u)
Siccome la visita DFS(GT) considera i vertici in ordine
decrescente di fine visita, per ogni discendente di u in A, e quindi
in particolare per v, vale
f[v] < f[u]
F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
Per il teorema delle parentesi, se v non è un discendente di u
nella prima visita, i due intervalli di visita di v e u devono
essere disgiunti, cioè deve valere:
d[v] < f[v] < d[u] < f[u]
d[v]
f[v]
d[u]
d[w]
f[w]
f[u]
Impossibile!
w è adiacente a v in G, e la visita
v è adiacente a w in GT
di v non puo’ terminare prima che sia iniziata la visita di un suo
adiacente, cioe’ f[v] non puo’ precedere d[w].
F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
Concludiamo la dimostrazione del lemma 3:
Siccome v è discendente di u in A, esiste un cammino da u a
v in GT, e quindi da v a u in G. D'altra parte, per cio’ che
abbiamo appena dimostrato, in G esiste anche un cammino da
u a v, cioe’ v ≈FC u .
Osservazione: si noti che per la dimostrazione del Lemma 3 è
essenziale che la visita DFS(GT) consideri i vertici in ordine
decrescente di fine visita.
F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
I lemmi permettono di dimostrare che ogni albero della
foresta ottenuta con la visita in profondita` di GT contiene :
• tutti i vertici di una c.f.c. di G
(Teorema 1 e Lemma 2)
• solo i vertici di una c.f.c. di G
(Lemma 3)
L’algoritmo Strongly-Connected-Components e`
corretto
ossia, quando applicato ad un grafo orientato, restituisce
una foresta i cui alberi individuano le componenti
fortemente connesse del grafo.
F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
In conclusione
{ G grafo orientato }
Strongly-Connected-Components (G)
1. Visita G con l’algoritmo DFS-VISITA-TUTTI-I-VERTICI
e costruisci una lista dei vertici
in ordine decrescente dei tempi di fine visita
2. Costruisci GT
3. Visita GT con l’algoritmo DFS-VISITA-TUTTI-I-VERTICI
considerando, nel ciclo principale dell’algoritmo, i vertici
nell’ordine trovato al passo 1.
{ Gli alberi della foresta ottenuta rappresentano le
componenti fortemente connesse di G}
F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04)
Riepilogo
• Definizione di componenti fortemente connesse
di un grafo orientato (il “che cosa”)
• Due algoritmi specifici (il “come”)
ƒ Un algoritmo “ingenuo”
ƒ Un algoritmo efficiente (basato sulla visita in
profondità)
F. Damiani - Alg. & Lab. 04/05