Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
implementazioni
e applicazioni
3 Maggio 2023
Esplorare un grafo da una sua rappresentazione
1 2 3
2 1 3 4 5 1 2 3 4 5 6 7 8
1 0 1 1 0 0 0 0 0
3 1 2 5 7 8
2 1 0 1 1 1 0 0 0
4 2 5 3 1 1 0 0 1 0 1 1
5 2 3 4 6 4 0 1 0 0 1 0 0 0
5 0 1 1 1 0 1 0 0
6 5
6 0 0 0 0 1 0 0 0
7 3 8 7 0 0 1 0 0 0 0 1
8 3 7 8 0 0 1 0 0 0 1 0
da [DPV]
DFS: visita in profondità
Idea di DFS: Esplorare quanto più in profondità possibile e tornare indietro
(“backtrack”) solo quando è necessario (come in un labirinto…)
s s s
Breadth First Search
Li sono i layers:
s L1 L2 L n-1
Algoritmo BFS:
• L0 = { s }.
• L1 = tutti i vicini di L0.
• L2 = tutti i nodi che non sono in L0 o L1, e che hanno un arco con un
nodo in L1.
• …
• Li+1 = tutti i nodi che non sono in un layer precedente, e che hanno un
arco con un nodo in Li.
Teorema.
Per ogni i, Li consiste di tutti i nodi a distanza i da s.
Esiste un cammino da s a t se e solo se t appare in qualche layer.
Grafo G
Albero BFS di G
Albero DFS di G
Implementazioni di BFS e DFS (par. 3.3)
Vedremo che BFS e DFS possono essere visti come lo stesso algoritmo
con l’unica differenza che BFS mantiene i vertici da analizzare in una
coda (queue) DFS in una pila (stack).
BFS si può implementare con una coda (queue FIFO); DFS con uno stack
(LIFO).
BFS implementazione
BFS: analisi
Prova:
E’ facile provare un running time O(n2).
Un’analisi più accurata da O(m+n). (segue)
uV deg(u) = 2m
Implementazione di BFS con una coda (queue)
• L’implementazione vista usa varie liste L[i], una per ogni layer.
• Si può implementare BFS con una singola lista gestita come una coda.
• L’algoritmo inserisce un nodo alla fine della coda appena è scoperto la
prima volta (discovered), mentre li esamina dal fronte della coda (da
quello scoperto per primo). Quando estrae un nodo, inserisce i suoi nodi
adiacenti non ancora esplorati.
• Si possono ottenere le stesse informazioni (layers e albero)
(1)
(2, 3)
(3, 4, 5)
(4, 5, 7, 8)
(5, 7, 8)
(7, 8, 6)
(8, 6)
(6)
()
Algoritmo DFS
Idea di DFS: Esplorare quanto più in profondità possibile e tornare
indietro (“backtrack”) solo quando è necessario (come in un labirinto…)
Algoritmo ricorsivo
R, insieme dei nodi esplorati
DFS implementazione (iterativa con stack)
1 2 3
Grafo G 2 1 3 4 5
3 1 2 5 7 8
4 2 5
5 2 3 4 6
6 5
7 3 8
8 3 7
5
8 4
7 3 6 5 5 3
8 3 3 4 4 2 1
7 7 7 3 3 3 3
5 5 5 2 2 2 2
2 2 2 2 2 2 2
3 1 1 1 1 1 1 1
1 2 2 2 2 2 2 2 2
Explored: 1, 3, 8, 7, 5, 6, 4, 2
Nota: i nodi adiacenti ad u sono esaminati nell’ordine inverso in cui appaiono nella lista di
adiacenza (differentemente dalla versione ricorsiva)
DFS: analisi
Prova:
Le operazioni elementari sono push e pop in O(1).
Quante sono al più?
Contiamo il numero di push (il numero di pop sarà uguale).
Ogni elemento è inserito nello stack ogni volta che un suo
adiacente è esplorato, cioè deg(v).
In totale
vV deg(v) = 2m
Osserva
Applicazioni di BFS e DFS
• Problema della connettività s-t:
Dati due nodi s e t, esiste un cammino fra s e t?
… e altre ancora.
3.4 Testing Bipartiteness
Bipartite Graphs
Applications.
Stable marriage: men = red, women = blue.
Scheduling: machines = red, jobs = blue.
a bipartite graph
25
Testing Bipartiteness
v2
v2 v3
v1
v4
v6 v5 v4 v3
v5
v6
v7 v1
v7
26
An Obstruction to Bipartiteness
27
Bipartite Graphs
L1 L2 L3 L1 L2 L3
28
Bipartite Graphs
Pf. (i)
Suppose no edge joins two nodes in the same layer.
By previous lemma, this implies all edges join nodes on
adjacent levels.
Bipartition: red = nodes on odd levels, blue = nodes on
even levels.
L1 L2 L3
Case (i)
29
Bipartite Graphs
Pf. (ii)
Suppose (x, y) is an edge with x, y in same level Lj.
Let z = lca(x, y) = lowest common ancestor.
Let Li be level containing z.
Consider cycle that takes edge from x to y,
then path from y to z, then path from z to x.
z = lca(x, y)
Its length is 1 + (j-i) + (j-i), which is odd. ▪
(x, y) path from path from
y to z z to x
30
Obstruction to Bipartiteness
5-cycle C
31
3.5 Connectivity in Directed Graphs
Directed Graphs
1 2
3 4 5
6 7
Ex. Web graph - hyperlink points from one web page to another.
Directedness of graph is crucial.
Modern web search engines exploit hyperlink structure to rank web
pages by importance.
33
Rappresentazione di un grafo diretto:
2 liste di adiacenza
Lista di adiacenza: array di n liste indicizzate dai nodi.
1 2
3 4 5
6 7
Lista out Lista in
1 2 3 4 1
4 5 2 1
2
3 6 3 1 4
4 3 6 4 1 2 5 7
5 6 5 2 7
6 6 3 4 7
7 7
4 5 6
Graph Search
36
Strong Connectivity
37
Strong Connectivity
s u
Pf. Follows from definition.
v
G Grev
39