…………………………………………………………………….. 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