Documente Academic
Documente Profesional
Documente Cultură
Alberto Montresor
Universit di Trento
This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike License. To view a
copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/2.5/ or send a letter to Creative
Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA.
Problemi di flusso 6 6
.... 4 4 5
5
V = {1, 2, 3, 4, 5, 6 } V = {1, 2, 3, 4, 5, 6 }
E = { (1,2), (1,4), (2,3), (4,3), E = { [1,2], [1,4], [2,3], [3,4],
Alberto Montresor 3 (5,3), (4,5), (4,1) }
Alberto Montresor
[3,5], [4,5] } 4
oi ad inventarne una fittizia.
discuteremo
Definizioni:dei principali
incidenza approcci per realizzare la struttura di
e adiacenza Rappresentazione grafi
otesi semplificativa che linsieme statico degli n nodi possa essere
1 a n.InPer
un eseguire unoperazione su tutti i nodi e su tutti gli archi,
grafo orientato Poniamo
each come un segue:
arco (u,v) si dice incidente da u in v n = |V| numero di nodi
e sullarco (u, v)
Un vertice v si dice adiacente a u
Spazio richiesto O(n2)
se e solo se (u, v) E
(1,2) incidente da 1 a 2
(1,4) incidente da 1 a 4
Verificare se il vertice u adiacente a v richiede tempo O(1)
(4,1) incidente da 4 a 1 Elencare tutti gli archi costa O(n2)
utti i nodi del grafo,
2 mentre il secondo scorre tutti i nodi adiacenti
azione. Per semplificare il testo3inoltre, useremo il termine
2 adiacente ad 1G.n
Liste / vettori di adiacenza
1
).size(). 3 adiacente a 2, 4, 5 Spazio richiesto O(n+m)
1 adiacente a 4 e viceversa Verificare se il vertice u adiacente a v richiede tempo O(n)
6 2 non adiacente a 3,4
on matrici 4
6 non adiacente ad alcun vertice Elencare tutti gli archi costa O(n+m)
5
ici per rappresentare un grafo e` basata su matrici. Dato un grafo
Alberto Montresor 5 Alberto Montresor 6
, indipendentemente
1 dalla cardinalit`a di G.adj4(u), 1perch0 e occorre
1 0 0 0 1 4 1 5 nil
Se il grafo non e` orientato, la matrice e` simmetrica, ovvero muv = mvu per ogni u, v. Un
Alberto Montresor
esempio di matrice 9 di adiacenza
Alberto Montresor
e` mostrata nella Fig. 9.6. 10
Con questa realizzazione e` banale verificare in tempo O(1) se un dato arco e` presente nel
Liste/vettore di adiacenza: grafo non orientato grafo oppure no. Purtroppo, Grafi pesati per ricavare linsieme di adiacenza G.adj(u) di un qual-
il tempo
siasi nodo u e` sempre (n), indipendentemente dalla cardinalit`a di G.adj(u), perche occorre
scandire unintera riga della
In alcunimatricecasi allaogni
ricerca degli
arco elementi
ha un muv =
peso (costo, 1. Inoltre,associato
guadagno) lo spazio
G.adj(u) = { v | [u,v] E or [v,u] E} Spazio: an + di
2bm
memoria occupato e` (n ) e il tempo per esaminare tutti gli archi e` (n ), anche se il
2 2
a b Il peso pu essere determinato tramite una funzione di costo
grafo e` sparso, ovvero contiene un numero m di archi che e` O(n). Se il grafo e` pesato, allora
p: V V R, dove R linsieme dei numeri reali
a b nella matrice M si utilizzano i pesi degli archi al posto degli elementi binari. Se puv e` il peso
Quando tra due vertici non esiste un arco, il peso infinito
dellarco (u, v), allora la matrice M diventa:
1 2 4 nil
2 puv , se (u, v) E, 1 2 3 4 5 6
2 1 3 nil muv =
3
+ (oppure ) se (u, v) / E. * 3 * 1 * *
A
1 3 2 4 5 nil 1
4 1 3 5 nil 2 3 * 4 * * *
6
5 3 4
4
nil
3 2 3 * 4 * 4 7 *
4 5 3
6 nil 4 1 * 4 * 8 *
1
4 5
1 7 6 * * 7 8 * *
8 6 * * * * * *
4 5
Alberto Montresor 11 Alberto Montresor 12
prevedono la possibilit`a di inserire o cancellare nodi o archi, di ottenere linsieme di tutti i nodi
Specifica
o dei nodi adiacenti ad un particolare nodo. Definizioni: Grado
Infine, la situazione pu`o essere ulteriormente complicata dal fatto che in molte applicazioni
ulteriori
G RAPH
informazioni (dette etichette, o pesi) sono associate ai nodi e/o agli archi. In tal caso, In un grafo non orientato
si parla di grafi etichettati (o pesati), i quali richiedono ulteriori operatori, per reperire e/o il grado di un vertice il numero di archi che partono da esso
Graph( ) % Crea un grafo vuoto
modificare le informazioni associate a nodi e/o archi. Non e` quindi un caso che nelle librerie
insertNode(N ODE u) % Aggiunge il nodo u al grafo
dei pi`u diffusi linguaggi di programmazione siano disponibili numerose realizzazioni per leIn un grafo orientato
insertEdge(N ODE u, N ODE v) % Aggiunge larco (u, v) al grafo
strutture di dati insieme, dizionario, etc., ma che non vi sia una realizzazione standard per i il grado entrante (uscente) di un vertice il numero di archi incidenti in (da) esso
(N ODE u) % Rimuove il nodo u dal grafo
grafi. deleteNode
Non staremo quindi noi ad inventarne una fittizia.
deleteEdge (N ODEsezioni
u, N ODEdiscuteremo
v) % Rimuove larco (u, nel grafo
v) realizzare in : 1
Nelle prossime dei principali approcci per la struttura di in : 2
in : 1 out: 1 out: 1
S ET adj(N ODE u) % Restituisce linsieme dei nodi adiacenti ad
dati grafo. Partiremo dallipotesi semplificativa che linsieme statico degli n nodi possa essere
u 2 2
2 3 out: 2 3
S ET V() dai numeri da 1 a n. Per eseguire%unoperazione
rappresentato su tutti
Restituisce linsieme i nodi
di tutti i nodie su tutti gli archi,
A1 3 1
utilizzeremo il costrutto foreach come segue:
2
Di tutte u
queste sole procedure adj() e V();
Complessit in : 1
foreach G.procedure,
V() do discuteremo la realizzazione delle
il motivo principale e` che, in questo testo, i grafi sono usati per rappresentare relazioni tra out: 1
foreach v G.adj(u) do O(n+m) liste di adiacenza
oggetti che non mutano nel tempo. In altri termini, non si effettuano mai ne cancellazioni ne 4 5 2 4 5
(u, v) 3
inserzioni, fai
ne diunoperazione
nodi ne di archi, sullarco
ma si esplorano sistematicamente
grafi
2 forniti in ingresso, al
O(n ) matrice di adiacenza
in : 2
fine di determinarne sottoinsiemi di nodi e/o di archi che soddisfino certe propriet`a. out: 2 in : 0
Qualora il grafo sia dinamico, la struttura di dati pi`u adatta O(m)
operazioni
per rappresentarlo dipende 6 6
0 out: 0
Il primo
dalla particolare
Alberto Montresor
foreach scorre del
utilizzazione tutti i nodi
grafo delRealizzazioni
stesso. grafo, mentre il secondo
efficienti scorre
di insiemi tutti i nodi 13adiacenti
e dizionari
Alberto Montresor 14
sono state
al nodo u presotrattatein
ampiamente nei capitoliPer
considerazione. precedenti, ed il lettore
semplificare pu`o cercare
il testo inoltre,di useremo
combinar- il termine G.n
le per esercizio in modo da fornire realizzazioni efficienti per le operazioni di inserzione e
Definizioni:
come abbreviazione Cammini
cancellazione di nodi e/o archi.
di G.V().size(). Definizioni: Cicli
Inoltre, nella vita di un programmatore capita di lavorare con i grafi senza menzionarli
In un grafo orientato
esplicitamente. Ad esempio,G=(V,E)
un file system pu`o essere visto come un albero di directory e file, In un grafo orientato G=(V,E)
9.3ma laRealizzazioni con matrici
presenza di hard link e symbolic link fanno s` che lalbero sia in realt`a un grafo. Le ope-
un cammino di lunghezza k una sequenza di vertici u , u , ..., u tale che un ciclo di lunghezza k un cammino u , u , ..., u tale che
0 1 k 0 1 k
razioni per la creazione di nodi e archi sono quindi condizionate dalla particolare semantica
Uno dei
associata
(u i, u ) E
modiepi`
i+1
al grafo,
per 0 i
u semplici
parleremo
k1
per rappresentare
di creazione di file al posto un grafo e` dibasata
di creazione nodi. su matrici. Dato un grafo
(u i, u i+1) E per 0 i k1, u 0 = u k, e k>2
G = (V, E), la matrice di adiacenza M = [muv ] (detta anche matrice di adiacenza nodi-nodi)
In un grafo non orientato G=(V,E) In un grafo non orientato G=(V,E)
e` una matrice di dimensione n n, tale che:
una catena di lunghezza k una sequenza di vertici u0, u1, ..., uk tale che un circuito di lunghezza k una catena u0, u1, ..., uk tale che
[ui, ui+1] E per 0 i k1 1, se (u, v) E, [ui, ui+1] E per 0 i k1, u0 = uk, e k>2
muv =
0, Esempio:
se (u, v)1,
/ 2,E.3, 5, 4 una Esempio: 1, 2, 3, 5, 4, 1 un
2
3 catena nel grafo con lunghezza 4 2 circuito con lunghezza 5
Se il grafo non e` orientato, la matrice e` simmetrica, ovvero muv = mvu per ogni u, v. Un 3
1
esempio di matrice di adiacenza e` mostrata nella Un Fig. 9.6. (catena) si dice semplice
cammino 1 Un ciclo (circuito) si dice semplice se
Con questa realizzazione e` banale verificare se tutti i suoi O(1)
in tempo verticisesono distinti
un dato arco e` presente nel tutti i suoi vertici sono distinti
(compaiono una sola volta nella (tranne ovviamente il primo / lultimo)
grafo oppure no. Purtroppo, il tempo per ricavare linsieme di adiacenza G.adj(u) di un qual-
4 sequenza)
siasi nodo u e` sempre (n), indipendentemente
5 dalla cardinalit`a di G.adj(u), perche occorre 4 5
scandire unintera riga della matrice alla ricerca degli elementi muv = 1. Inoltre, lo spazio
di memoria occupato e` (n2 ) e il tempo per esaminare tutti gli archi e` (n2 ), anche 15
se il 16
Alberto Montresor Alberto Montresor
Definizioni: Grafi aciclici Definizioni: Grafo completo
Un grafo senza cicli detto aciclico Un grafo completo un grafo che ha un arco tra ogni coppia di vertici.
Un albero libero un grafo non orientato connesso, aciclico In un grafo non orientato G=(V, E)
Se qualche vertice detto radice, otteniamo un albero radicato
un albero di copertura T un albero libero T = (V, E) composto da tutti i nodi di V
e da un sottoinsieme degli archi (E E), tale per cui tutte le coppie di nodi del
Un insieme di alberi detta foresta grafo sono connesse da una sola catena nellalbero.
rad
ice
2 2 2
3 3 3
1 1 1
6 6 6
4 5 4 5 4 5
8 9
Alberto Montresor 19 Alberto Montresor 20
Un esempio di utilizzo dei grafi Un esempio di9.utilizzo
CAPITOLO GRAFI dei grafi 149
Sherlock Holmes indaga sulla morte del duca McPollock, ucciso da unesplosione nel suo maniero: F E
Watson: Ci sono novit, Holmes: pare che il testamento, andato distrutto nellesplosione, fosse
stato favorevole ad una delle sette amiche del duca H B C
Holmes: Ci che pi strano, che la bomba sia stata fabbricata appositamente per essere nascosta G A
nellarmatura della camera da letto, il che fa supporre che lassassino abbia necessariamente fatto
a)
pi di una visita al castello
Watson: Ho interrogato personalmente le sette donne, ma ciascuna ha giurato di essere stata nel
A H B
castello una sola volta nella sua vita. H B
G B
(1) Ann ha incontrato Betty, Charlotte, Felicia e Georgia; ?
G A ? G A
(2) Betty ha incontrato Ann, Charlotte, Edith, Felicia e Helen; H
(3) Charlotte ha incontrato Ann, Betty e Edith; b)
(4) Edith ha incontrato Betty, Charlotte, Felicia;
(5) Felicia ha incontrato Ann, Betty, Edith, Helen; B
H E
(6) Georgia ha incontrato Ann e Helen;
(7) Helen ha incontrato Betty, Felicia e Georgia.
G F C
Vedete, Holmes, che le testimonianze concordano. Ma chi sar lassassino?
c)
Holmes: Elementare, Watson: ci che mi avete detto individua inequivocabilmente lassassino!
Alberto Montresor 21 Figura
Alberto Montresor 9.5: a) Il grafo degli incontri. b) Rappresentazione di circuiti di lunghezza 4 come intersezione di 22
intervalli della retta. c) Possibili periodi di soggiorno al castello cancellando il nodo A.
Problema: Visita grafi Visita: attenzione alle soluzioni facili
Watson: Ho interrogato personalmente le sette donne, ma ciascuna ha giurato di essere stata
nel castello una sola volta nella sua vita. Dagli interrogatori risulta che:
Definizione del problema Prendere ispirazione dalla visita degli alberi
(1) Ann ha incontrato Betty, Charlotte, Felicia e Georgia;
Dato un grafo G=(V, E) ed un vertice r di V (detto sorgente o radice), Ad esempio:
(2) Betty ha incontrato Ann, Charlotte, Edith, Felicia e Helen;
visitare ogni vertice raggiungibile nel grafo a partire dal vertice r (3) Charlotte ha incontrato Ann, Betty e Edith;
6 utilizziamo
(4) Edith hauna visita Betty,
incontrato BFS Charlotte,
basata suFelicia;
coda Algoritmi e Strut
Ogni nodo deve essere visitato una volta sola (5) Felicia ha incontrato Ann, Betty, Edith,
trattiamo i vertici adiacenti come seHelen;
fossero i figli
(6) Georgia ha incontrato Ann e Helen;
Visita in ampiezza (breadth-first search) (7) Helen ha incontrato Betty, Felicia e Georgia.
Visita i nodi espandendo la frontiera fra nodi scoperti / da scoprire visita (GHolmes,
Vedete, RAPH G,che N ODE r)
le testimonianze concordano. Ma chi sar`a lassassino?
Esempi: Cammini pi brevi da singola sorgente Q UEUE
Holmes: S
Elementare, mio caro()
Queue Watson: ci`o che mi avete detto individua inequivocabilmente
S.enqueue(r)
lassassino!
to
Visita in profondit (depth-first search) while not
Soluzione S.isEmpty
di Holmes: () do
Il grafo degli incontri tra le donne, indicate con le loro iniziali, e`
lia
Visita i nodi andando il pi lontano possibile nel grafo disegnatoN ODE
nella ogni donna()
Sedequeue
Fig.u9.5a).S. avesse detto la verit`a, questo grafo dovrebbe rappre-
r r u = 6
6 6
2 2
3 9 3 9
1 1
11 11
4 5 4 5
10 10
8 8
7 7
Coda:{6} Coda:{2,4,9}
r u = 2 r u = 4
6 6
2 2
3 9 3 9
1 1
11 11
4 5 4 5
10 10
8 8
7 7 u Nodi gi visitati:
u Marcare un nodo visitato in modo che
Coda:{4,9,3,1,6} Coda:{9,3,1,6,5,6,1,3} non possa essere visitato di nuovo
u Bit di marcatura: nel vertice, array
separato, etc.
S.insert(r) insert() e remove() visitare i nodi a distanza k prima di visitare i nodi a distanza k+1
nonboolean[
fortemente connessi,
] visitato newe` necessario
boolean[1 invece fare pi`u passate, ovvero far ripartire lalgoritmo
. . . G.n]
Numero di Erds
da un nodo non
foreach u scoperto
G.V() in {r} precedenza.
do visitato[u] false
Erds ha erds = 0
Lordine
visitato[r]incuitrue vengono visitati i nodi dipende dalla politica di estrazione della procedura
remove while().not
Esistono due ()
S.isEmpty approcci
do principali: I co-autori di Erds hanno erds = 1
Breadth-First-Search
{ esamina il nodo (uBFS } ), ovvero visita in ampiezza (detta anche a ventaglio); un co-autore con erds = k, ma non con
foreach v G.adj
Depth-First-Search (u)),do
(DFS ovvero visita in profondit`a (detta anche a scandaglio). un co-autore con erds < k, X ha erds=k +1
{ esamina larco (u, v) }
Chi non raggiunto da questa definizione ha erds = +
if not visitato[v] then
visitato[v] true
S.enqueue(v)
3 11 2 9
6 4 5
Come tributo scherzoso alla sua estrema prolificit`a, e` nato il concetto di numero di Erdos,
un coefficiente assegnato ad ogni matematico (in generale, ad ogni autore scientifico) per mi-
surare la sua distanza da Erdos. Paul Erdos ha erdos = 0. I co-autori dei suoi articoli hanno
erdos = 1. Chi ha scritto articoli in collaborazione con autori con erdos = 1 (ma non con
Erdos) ha erdos = 2. Ricorsivamente, chi ha collaborato con autori con erdos = k (ma non
con autori con erdos < k), ha erdos = k + 1. Chi non e` raggiunto da questa definizione,
ha erdos = . Il massimo numero di Erdos finito e` 15; e` scherzosamente considerato un
punto donore avere un numero di Erdos basso. Gli autori di questo libro hanno erdos 3 e 4,
rispettivamente.
Dato il grafo delle collaborazioni scientifiche (dove ogni autore e` un nodo e due autori sono33
Alberto Montresor Alberto Montresor 34
uniti da un arco se e solo se hanno scritto un articolo scientifico insieme), e` possibile calcolare
ilCalcolo
numero di delErd
numero di Erds
os di ogni autore utilizzando una visita in ampiezza a partire da Erdos. Esempio
0
erdos(G RAPH G, N ODE r, integer[ ] erdos, N ODE[ ] p) 6
Q UEUE S Queue()
S.enqueue(r) 2
3 10
foreach u G.V() {r} do erdos[u] =
erdos[r] 0 1
p[r] nil 11
while not S.isEmpty() do
N ODE u S.dequeue()
4 5
foreach v G.adj(u) do % Esamina larco (u, v) 12
9
if erdos[v] = then % Il nodo u non e` gi`a stato scoperto
erdos[v] erdos[u] + 1
p[v] u 7
S.enqueue(v)
Coda:{6}
In questa versione della BFS, invece di utilizzare un vettore di booleani per la marcatura,
utilizziamo il vettore erdos di interi, in cui i nodi non ancora scoperti hanno numero di Erdos
pari a . Il nodo radice (Erdos) viene inizializzato a zero; ogni volta che viene analizzato un35
Alberto Montresor Alberto Montresor 36
Esempio Esempio
0 0
1 6 1 6
1 1
2 2
3 9 3 2 9
1 1 2
11 11
1 1
4 5 4 5
8 10 8 10
7 7
Coda:{2,4,9} Coda:{4,9,3,1}
Esempio Esempio
0 0
1 6 1 6
1 1
2 2
3 2 9 3 2 9
1 2 1 2
11 11
1 1
4 5 2 10
4 5 2 10
8 8
2
7 7
Coda:{9,3,1,5} Coda:{3,1,5,8}
4 5 2 10
4 5 2 10
8 8
2 2
7 7
Coda:{1,5,8} Coda:{5,8}
Esempio Esempio
0 0
1 6 1 6
1 1
2 2
3 2 9 3 2 9
1 2 1 2
11 11
1 1
4 2 4 5 2
5 10 10
8 8
2 2
3 3
7 7
Coda:{8,7} Coda:{7}
Algoritmo generico per la visita Visita in profondit (depth first search, DFS)
9.5.4 Visita DFS
Alcune definizioni Alcune cose da notare: Il metodo
Visita di visita DFS e` una diretta estensione
in profondit Struttura delladivisita
dati in ordine anticipato di un
158
L'albero T contiene i vertici visitati I nodi vengono visitati al pi una ordinato.
E' spessoQuando viene visitato
una subroutine un nuovo nodo u,Ricorsione
della ci si allontana da esso
al posto il pila
di una pi`u possibil
volta (marcatura) un cammino (o catena), visitando
soluzione di altri problemi nodi (e archi) nel cammino
esplicita fino a giungere in un vico
S T contiene i vertici aperti: zato a tutti false). Come negli alberi, e` possibile d
co, ovvero in un nodo v i cui nodi adiacenti sono gi`a stati tutti visitati. Quando si e` rag
vertici i cui archi uscenti non sono Tutti i nodi raggiungibili da r Utilizzata per coprire l'intero grafo, postvisita (riga (2)).
v si torna indietro lungo lultimo arco visitato e si riprende la visita allontanandosi lu
ancora stati percorsi vengono visitati non solo i nodi raggiungibili da
altro cammino di nodi (e archi) non ancoradfs visitati.
(G RAPH Questa
G, N ODEtecnica e` unapplic
di visita] visitato)
u, boolean[
Ne segue che T contiene una singola sorgente
T-S T contiene i vertici chiusi:
della(diversamente
tecnica backtrack [cfr. 16].
da BFS) visitato[u] true
vertici i cui archi uscenti sono stati esattamente tutti i nodi Nella visita DFS, linsieme S potrebbe (1) essere
{ esamina realizzato
il nodo utramite una pila} (politic
(caso previsita)
tutti percorsi raggiungibili da r
mozione LIFO). E` pi`u naturale invece descrivere
Output foreach lalgoritmo
v G.adj(u) in do
maniera ricorsiva, in
V-T contiene i vertici non visitati pi`
u Invece
coincisodi ed
un elegante.
albero, unaLalgoritmo esamina larco (u,
foresta DF viene richiamato su un grafov)G a partire da un n
{
mentre visitato e`Gil=(V,
(depth-first) vettore if not visitato[v]
E)di booleani che rappresenta linsiemethen di nodi gi`a scoperti (in
Se u si trova lungo il cammino che dfs(G, v, visitato)
va da r al nodo v, diciamo che: Contenente un insieme di
(2) { esamina il nodo u (caso postvisita) }
u un antenato di v alberi DF
v un discendente di u
Esempio 9.14 (DFS). Lordine di visita DFS dei n
47
mendo di partire dal nodo r = 1 e che gli insiemi
48
a
Alberto Montresor Alberto Montresor
Componenti connesse e fortemente connesse Definizioni: Raggiungibilit
4 5 4 5
6 51
Alberto Montresor Alberto Montresor 52
Componenti connesse Componenti connesse
1
integer[ ] cc(G RAPH G, S TACK S) 1 3
integer[ ] id new integer[1 . . . G.n] 2 2
2
foreach u 2 G.V() do id[u] 0 1 5 6
integer counter 0 3
1
while not S.isEmpty() do
u S.pop() 10
if id[u] = 0 then
counter counter + 1 2 3
4 2
ccdfs(G, counter , u, id) 7 11
9
return id 1
2
ccdfs(G RAPH G, integer counter , N ODE u, integer[ ] id)
id[u] counter 8
foreach v 2 G.adj(u) do
if id[v] = 0 then
ccdfs(G, counter , v, id)
La visita DFS genera lalbero (foresta) dei cammini DFS Variabili globali dfs-schema(G RAPH G, N ODE u)
Tutte le volte che viene incontrato un arco che connette un nodo marcato ad uno time orologio esamina il nodo u prima (caso pre-visita)
non marcato, esso viene inserito nellalbero T time time + 1; dt[u] time
dt discovery time
foreach v G.adj(u) do
Gli archi non inclusi in T possono essere divisi 1 2 ft finish time
esamina larco (u, v) di qualsiasi tipo
in tre categorie durante la visita: if dt[v] = 0 then
se larco esaminato passando da un nodo di T esamina larco (u, v) in T
3 4 dfs-schema(g, v)
12T ,
ad un altro nodo che suo antenato in
detto arco allindietro else if dt[u] > dt[v] and ft[v] = 0 then
1 esamina larco (u, v) allindietro
se larco esaminato passando da un nodo
else if dt[u] < dt[v] and ft[v] = 0 then
di T ad un suo discendente (che non sia figlio)
esamina larco (u, v) in avanti
in T detto arco in avanti 2 4
else
altrimenti, detto arco di attraversamento esamina larco (u, v) di attraversamento
3 esamina il nodo u dopo (caso post-visita)
time time + 1; ft[u] time
Alberto Montresor 55 Alberto Montresor 56
CAPITOLO 9. GRAFI 161
Esempio Esempio
[1, ] [1, ]
dfs-schema(G RAPH G, N ODE u)
F F
esamina il nodo u prima (caso pre-visita) [2, ]
B time time + 1; dt[u] time B
C foreach v G.adj(u) do C
I esamina larco (u, v) di qualsiasi tipo I
A if dt[v] = 0 then A
M (u, v) in T
esamina larco M
dfs-schema(g, v)
else if dt[u] > dt[v] and ft[v] = 0 then
esamina larco (u, v) allindietro
D E D E
else if dt[u] < dt[v]Land ft[v] = 0 then L
H esamina larco (u, v) in avanti H
else
esamina larco (u, v) di attraversamento
G G
esamina il nodo u dopo (caso post-visita)
time time + 1; ft[u] time
G G
Esempio Esempio
[1, ] [1, ]
F F
[2, ] [2, ]
[3, ] B [3, ] B
C I C I
A [6, 7] A [6, 7]
M M
[5, ] [5, ]
[4, ] D E [4, ] D E
H L H L
G G
[8, ]
[9, ] [9, ]
G G
[8, ] [8, ]
Esempio Esempio
[1, 18] [1, 18]
F F
[2, 17] [2, 17]
[3, 16] B [3, 16] B
C I C I
A [6, 7] [10, 11] A [6, 7] [10, 11] [19, ]
M M
[5,14 ] [5,14 ]
[4,15] D E [4,15] D E
H L H L
2 2 2 Algoritmo [2,5]
Si effettua una DFS 2
1 3 4 3 4 4 Loperazione di visita consiste
[1, 10] [6,9] [3,4]
nellaggiungere il vertice alla
5 5 5 testa di una listaat finish time 1 3 4
Si restituisce la lista di vertici
Output: Output: 1 Output: 1 3 [7,8]
Output 5
2 Sequenza ordinata di vertici,
in ordine inverso di finish time
4 4
Perch funziona?
ts-dfs(G RAPH G, N ODE u, boolean[ ] visitato, S EQUENCE L) ts-dfs(G RAPH G, N ODE u, boolean[ ] visitato, S TACK S)
visitato[u] true visitato[u] true
foreach v 2 G.adj(u) do foreach v 2 G.adj(u) do
if not visitato[v] then if not visitato[v] then
ts-dfs(G, v, visitato, L)
ts-dfs(G, v, visitato, S)
L.insert(L.head(), u)
S.push(u)
Definizioni
2
G un sottografo di G (G G) se 3
2
e solo se V V e E E 3 1
G massimale non esiste un 1 6
sottografo G di G che sia 6
fortemente connesso e pi grande 4 5
di G, ovvero tale per cui G G G.
4 5
dt(C) = min{dt[u] : u C}
Che rapporto c fra le SCC del grafo G e del suo trasposto GT ?
ft(C) = max{ft[u] : u C}
Grafo delle componenti Gc = (Vc, Ec)
Teorema
In base a queste definizioni, possiamo enunciare il seguente teorema.
Vc = {C , C , . . . , C }, dove C li-esima componente fortemente connessa di G;
1 2 k i Siano C e C due componenti distinte nel grafo orientato G = (V, E).
13
Ec ={(C ,C ): (u ,u ) E :u C ,u C }
Teorema 9.1. Siano C e C due componenti distinte nel grafo orientato G = (V, E). Suppo-
i j i j i i j j Supponiamo che esista un arco (C, C) Ec. Allora ft(C) > ft(C)
niamo che esista un arco (C, C ) E c . Allora ft(C) > ft(C ).
[9,10]
Il grafo delle [2,11] [1, 8]
componenti 2 Dimostrazione Sono dati due casi: viene scoperto prima un nodo di C
[3,10] oppure di C . 2
[11,12]
aciclico? 3 [1,12] 2 3
dt(C) < dt(C ): sia x il primo nodo scoperto in C, allistante 3 dt(C). Poiche tutti i nodi
1 1
in C C sono raggiungibili 1 da x e non ancora scoperti, la loro visita inizier`a e terminer`a
6 prima della terminazione della visita di x. Quindi ft(C) = ft(x) > ft(y), per ogni y [5,7] 6
C C {x}. Ne segue che ft(C) > ft(C ). [7,8] 6
[2, 7]
4 5 [4,9] 4 5
dt(C ) < dt(C): sia y il primo nodo scoperto 4 in C ; tutti i nodi in C sono raggiungibili
5
da y e non ancora scoperti. Al termine della visita di tutti i nodi di C , tutti i nodi[3,4] di C
non sono ancora stati
83 scoperti. La [5,6]
loro visita inizier`
a e terminer` a dopo ft(C ); ne segue che 84
Alberto Montresor Alberto Montresor
ro quindi parte di ununica componente, una contraddizione.
to diComponenti
tempo di inizio e di fine per
fortemente le componenti.
connesse Sia C un
- dimostrazione sottoin-
correttezza Componenti fortemente connesse
(C) come il primo tempo di scoperta e ft(C) come lultimo tempo di
Si pu estendere il concetto di dt e ft al grafo delle componenti Algoritmo di Tarjan (1972)
dt(C) = min{dt[u] : u C}
Tarjan, R. E. "Depth-first search and linear graph algorithms", SIAM Journal on
Computing 1(2): 146160 (1972)
ft(C) = max{ft[u] : u C}
Corollario
Algoritmo con costo O(m+n) come Kosaraju
ni, possiamo enunciare il seguente teorema.
Siano C e C due componenti distinte nel grafo orientato G = (V, E). Suppo-
E preferito a Kosaraju in quanto necessita di una sola visita e non richiede il
C due componenti distinte nel grafo orientato G = (V, E). Suppo- grafo trasposto
niamo che esista un arco (u,v) ET con u C, v C. Allora ft(C) < ft(C)
(C, C ) E . Allora ft(C) > ft(C ).
c
(u,v) ET [9,10]
(v,u)scoperto
E prima un nodo di C oppure di C . [1, 8]
ati due casi: viene [11,12] 2
c
(C, C) E
3
x il primo nodo scoperto
ft(C) < ft(C)in C, allistante dt(C). Poiche tutti i nodi
ungibili da x e non ancora scoperti, la loro visita1 inizier`a e terminer`a
ione della visita di x. Quindi ft(C) = ft(x) > ft(y), per ogni y 6 [5,7]
gue che ft(C) > ft(C ). [2, 7]
4 5
y il primo nodo scoperto in C ; tutti i nodi in C sono raggiungibili
operti. Al termine della visita di tutti i nodi di C , tutti i nodi di C
[3,4] 86
Alberto Montresor Alberto Montresor
scoperti. La loro visita inizier`a e terminer`a dopo ft(C ); ne segue che