Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Grafi
Rappresentazione e visita Ordinamento topologico
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
I ponti di Königsberg
Non è possibile raggiungere A, B, C, D attraversando esattamente una volta
i 7 ponti sul fiume Pregel
L. Eulero (1736)
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Problemi di percorso
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Orari aerei e ferroviari
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
La struttura dei servizi
Telecomunicazioni
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Reti di calcolatori
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Architettura di un calcolatore
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Che cos’è un grafo?
Archi = coppie di nodi Nodi
G = (N, A)
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Grafi orientati
) , ( N A G =
N N
A ⊆ × L’ordine conta:
(a, b) ≠ (b, a)
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Grafi orientati
) , ( N A G =
k i A a a a a
a , , ,
kt.c. (
i,
i+) ∈ per 1 ≤ <
:
cammino
1 2K
1Grafi orientati
k i A a a a a
a , , ,
kt.c. (
i,
i+) ∈ per 1 ≤ <
:
cammino
1 2K
1k i a a a a
a a a
i i k
k
<
<
≠
= , ma
+se 1 t.c.
, , , cammino : ciclo
1 1
2
1
K
Questo non è
un ciclo
Questo è un ciclo
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Grafi non orientati
} , : } ,
{{ a b a b N
A ⊆ ∈
Gli archi non hanno un verso
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Grafi non orientati
distinti tutti sono archi gli
1 per } , {
t.c.
, , , : catena
1 2 1
k i A a a
a a a
i i
k
<
≤
+
∈ Questa è una K
catena
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Grafi non orientati
k k
a a a a a
1
=
2 1
salvo ripetuti nodi sono ci non
t.c.
, , , catena una :
circuito K
Se questo ha la forma {a,b}, {b,a}
dunque non è un ciclo (e neppure un catena)
Questo è un
circuito (anche
detto “cricca”)
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Rappresentazioni dei grafi
1 2
3 4
N = {1,2,3,4}
A = (1,2), (1,3), (3,2), (2,4)
0 0 0 0
0 0 1 0
1 0 0 0
0 1 1 0
∈
= 0 altrimenti ) , ( se ) 1 ,
( a a A
j i
M
i j1 2 3 4
1 2 3 4
Questa è una matrice di adiacenza
Come si rappresenta un grafo in memoria?
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Rappresentazioni dei grafi
1 2
3 4
N = {1,2,3,4}
A = (1,2), (1,3), (3,2), (2,4)
0 0 0 0
0 0 1 0
1 0 0 0
0 1 1 0 1 2 3 4
1 2 3 4
2 3
4 2 1 2 3
4 Liste di
adiacenza Non sono altro che
una matrice di adiacenza sparsa
Rappresentazioni dei grafi
Esistono altre rappresentazioni, tra cui le “matrici di incidenza
nodi-archi”
Un po’ complicate, richiedono spazio O(nm) (n vertici ed m archi) e sono utili
solo per particolari problemi
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Visita di un grafo
1 2
3 4
1
3 2
4
1
3
2
4 Una visita di un grafo G = (N, A) è un insieme di cammini in G con origine in uno stesso stesso vertice.
Una visita è dunque un albero, i cui vertici sono contenuti in N ed i cui archi sono contenuti in A (è un sottografo di G), la cui radice è l’origine dei cammini.
Una visita di un grafo G = (N, A) è un insieme di cammini in G con origine in uno stesso stesso vertice.
Una visita è dunque un albero, i cui vertici sono contenuti in N ed i cui archi sono contenuti in A (è un sottografo di G), la cui radice è l’origine dei cammini.
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Visita di un grafo
Come fare per visitare un grafo?
Possiamo adottare le stesse tecniche già usate per gli alberi: partiamo da un nodo e
procediamo in ampiezza/profondità
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Un problema: e i cicli?
Se la ricerca entra nel ciclo dei nodi blu non troverà mai
il nodo rosso!!
Conviene ricordare quali nodi abbiamo
visitato
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Schema di una visita
Visit (G, r) // Pre: r ∈ N[G] (i nodi di G) F ← {r}, V ← {r} // V = visitati
root(T) ← r while F ≠ ∅ do
scegli v ∈ F, F ← F – {v}
foreach u ∈ N[G] – V and (v, u) ∈ A[G] do V ← V ∪ {u}, F ← F ∪ {u}, T ← T ∪ {(u, v)}
return T
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Partizioni per una visita
G v
Interno = V – F Frontiera = F Esterno = N – V
BFS o DFS?
Visit (G, r) // Pre: r ∈ N[G] (i nodi di G) F ← {r}, V ← {r} // V = visitati
root(T) ← r while F ≠ ∅ do
// Invariante?
… return T
BFS: La frontiera contiene vertici la cui “distanza” da r differisce al più di 1
DFS: la sequenza dei vertici inseriti
in V costituisce una visita in
profondità in ordine anticipato di T
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
BFS o DFS?
Visit (G, r) // Pre: r ∈ N[G] (i nodi di G) F ← {r}, V ← {r} // V = visitati
root(T) ← r while F ≠ ∅ do
scegli v ∈ F, F ← F – {v}
foreach u ∈ N[G] – V and (v, u) ∈ A[G] do V ← V ∪ {u}, F ← F ∪ {u}, T ← T ∪ {(u, v)}
return T
Tutto dipende da come si sceglie v ∈ F
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
BFS o DFS?
scegli v ∈ F, F ← F – {v}
BFS: si sceglie il vertice rimasto in F il più a lungo
Allora F è una coda
DFS: si sceglie il vertice posto in F per ultimo
Allora F è una pila
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
BFS e BFS
BFS (G, r)
F ← NewQueue(), Enqueue(r, F) V ← {r}, root(T) ← r while not IsEmptyQueue(F) do
v ← Dequeue(F) foreach u ∈ N[G] – V and
(v, u) ∈ A[G] do Enqueue(u, F) V ← V ∪ {u}, T ← T ∪ {(u, v)}
return T
DFS (G, r)
F ← NewStack(), Push(r, F) V ← {r}, root(T) ← r while not IsEmptyStack(F) do
v ← Top(F), Pop(F) foreach u ∈ N[G] – V and
(v, u) ∈ A[G] do Push(u, F) V ← V ∪ {u}, T ← T ∪ {(u, v)}
return T
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Visita in ampiezza esempio.
1 2
4 5 6
3
Frontiera = 1 Albero = 1
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Visita in ampiezza esempio.
1
2
4 5 6
3
Frontiera = 2 4 1
4 2
Albero =
Visita in ampiezza esempio.
1 2
4
5 6
3
Frontiera = 5 1
4 2
Albero =
5
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Visita in ampiezza esempio.
1 2
4 5
6
3
Frontiera = 3 6 1
4 2
Albero =
5
3 6
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Visita in ampiezza esempio.
1 2
4 5 6
3
Frontiera = ∅ 1
4 2
Albero =
5
3 6
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Visita in profondità esempio.
1 2
4 5 6
3
Frontiera = 1 Albero = 1
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Visita in profondità esempio.
1 2
4 5 6
3
Frontiera = 2 1 Albero = 1
2
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Visita in profondità esempio.
1 2
4 5 6
3
Frontiera = 5 2 1 Albero = 1
2 5
Visita in profondità esempio.
1 2
4 5 6
3
Frontiera = 3 5 2 1 Albero = 1 2
5
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Visita in profondità esempio.
1 2
4 5 6
3
Frontiera = 5 2 1 Albero = 1
2 5 3
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Visita in profondità esempio.
1 2
4 5 6
3
Frontiera = 6 5 2 1 Albero = 1 2
5
3 6
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Visita in profondità esempio.
1 2
4 5
63
Frontiera = 5 2 1 Albero = 1
2 5
3 6
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Visita in profondità esempio.
1 2
4
5 63
Frontiera = 2 1 Albero = 1
2 5
3 6
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Visita in profondità esempio.
1
24
5 63
Frontiera = 1 Albero = 1
2 5
3 6
Visita in profondità esempio.
1
24
5 63
Frontiera = 4 1 Albero = 1
2
5
4
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Visita in profondità esempio.
1
24 5 6
3
Frontiera = 1 Albero = 1
2 5
3 6
4
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Visita in profondità esempio.
1 2
4 5 6
3
Frontiera = ∅ Albero = 1
2 5
3 6
4
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Ordinamento topologico
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Ordinamento topologico
1 2
3 4
1, 3, 2, 4 è un ordinamento topologico di G;
1, 2, 4, 3 non lo è perché (3,2) ∈ A mentre 3 segue 2 in questa permutazione.
G
Dato un grafo finito orientato G = (N, A), un ordinamento topologico di G consiste in una permutazione v
1,…,v
ndi N tale che:
(v
i, v
j) ∈ A ⇒ i ≤ j.
Dato un grafo finito orientato G = (N, A), un ordinamento topologico di G consiste in una permutazione v
1,…,v
ndi N tale che:
(v
i, v
j) ∈ A ⇒ i ≤ j.
Allora G non deve contenere cicli
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Visita in profondità rivista
DFS (G)
foreach v ∈ N[G] // inizializza i colori Colore[v] ← Bianco; Tempo[v] ← indef tempo ← 0; // variabile globale
foreach u ∈ N[G] // itera la visita in prof.
if Colore[u] = Bianco then DFS-Visit(u)
DFS-Visit (u)
Colore[u] ← Grigio; tempo ← tempo + 1 foreach (u,v) ∈ A[G]
if Colore[v] = Bianco then DFS-Visit(v);
Colore[u] ← Nero
Tempo[u] ← tempo, tempo ← tempo + 1
Tempi e precedenze
Teorema. Sia G = (N, A) un grafo orientato aciclico:
se (u, v) ∈ A, con u ≠ v, allora dopo DFS(G) Tempo[u] > Tempo[v].
Teorema. Sia G = (N, A) un grafo orientato aciclico:
se (u, v) ∈ A, con u ≠ v, allora dopo DFS(G) Tempo[u] > Tempo[v].
Per assurdo sia (u, v) ∈ A, ma Tempo[u] < Tempo[v]:
Al tempo t = Tempo[u] si aveva Colore[u] = Nero,
Colore[v] = Bianco oppure Grigio
Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez. 18
Tempi e precedenze
Teorema. Sia G = (N, A) un grafo orientato aciclico:
se (u, v) ∈ A, con u ≠ v, allora dopo DFS(G) Tempo[u] > Tempo[v].
Teorema. Sia G = (N, A) un grafo orientato aciclico:
se (u, v) ∈ A, con u ≠ v, allora dopo DFS(G) Tempo[u] > Tempo[v].
Bianco: (u, v) ∈ A implica che le adiacnze di u non sono tutte esplorate Grigio: esiste un cammino da v
ad u, dunque (u, v) ∈ A implica G ha un ciclo Colore[v] a t =
Topological Sorting (TS)
TS (G)
foreach v ∈ N[G] do Colore[v] ← Bianco
L ← NIL // lista di vertici (globale)foreach u ∈ N[G] do // itera la visita in prof.
if Colore[u] = Bianco then DFS-Visit-List(u) return L
DFS-Visit-List (u) Colore[u] ← Grigio;
foreach (u,v) ∈ A[G] do
if Colore[v] = Bianco then DFS-Visit(v);
Colore[u] ← Nero
L ← Cons(u,L); // se u precede v in L allora