Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o...

39
Grafi: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico

Transcript of Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o...

Page 1: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

Grafi: Visite (BFS) DFS e applicazioni

DAG e ordinamento topologico

Page 2: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

Grafi (non orientati) Grafo (non orientato): G = (V, E) • V = nodi (o vertici) • E = archi fra coppie di nodi. • Modella relazioni fra coppie di oggetti. • Parametri della taglia di un grafo: n = |V|, m = |E|.

2

V = { 1, 2, 3, 4, 5, 6, 7, 8 }

E = { (1,2), (1,3), (2,3), (2,4), (2,5), (3,5), (3,7), (3,8), (4,5), (5,6) }

n = 8

m = 11

Page 3: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

Grafi diretti (o orientati) • Grafo diretto: G = (V, E)

• V = nodi (o vertici)

• E = archi diretti da un nodo (coda) in un altro (testa)

• Modella relazioni non simmetriche fra coppie di oggetti.

• Parametri della taglia di un grafo: n = |V|, m = |E|.

3

v2 v3

v6 v5 v4

v7 v1

Page 4: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

Problemi di connettività in grafi non orientati • Problema della connettività s-t:

Dati due nodi s e t, esiste un cammino fra s e t?

• Problema del cammino minimo s-t:

Dati due nodi s e t, qual è la lunghezza del cammino minimo fra s e t?

Diremo: t raggiungibile da s se esiste un cammino fra s e t;

distanza di s da t = lunghezza del cammino minimo fra s e t

• Abbiamo visto: Breadth First Search (BFS)

• Oggi vedremo: Depth First Search (DFS)

4

Page 5: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

Componenti connesse • Def. La componente connessa di un grafo che contiene un nodo s è

l’insieme dei nodi raggiungibili da s.

La componente connessa che contiene 1 è { 1, 2, 3, 4, 5, 6, 7, 8 }. La componente connessa che contiene 9 è { 9, 10}. La componente connessa che contiene 11 è { 11, 12, 13 }.

5

Page 6: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

Problemi risolvibili con BFS o DFS • Problema della connettività s-t: Dati due nodi s e t, esiste un cammino fra s e t?

• Problema del cammino minimo s-t: Dati due nodi s e t, qual è la lunghezza del cammino

minimo fra s e t?

• Problema della componente connessa di s: trovare tutti i

nodi raggiungibili da s

• Problema di tutte le componenti connesse di un grafo G: trovare tutte le componenti connesse di G

Page 7: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

BFS: visita in ampiezza

Idea della BFS: Esplorare a partire da s in tutte le possibili direzioni, aggiungendo nodi, uno strato ("layer“) alla volta.

s s s

Page 8: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

DFS: visita in profondità Idea di DFS: Esplorare quanto più in profondità possibile e tornare indietro (“backtrack”) solo quando è necessario (come in un labirinto…)

Gli archi non tratteggiati in (g) formano l’albero DFS di G

G

Page 9: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

Algoritmo DFS Idea di DFS: Esplorare quanto più in profondità possibile e tornare indietro (“backtrack”) solo quando è necessario (come in un labirinto…) Algoritmo ricorsivo

Page 10: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

Algoritmo DFS

Proprietà 1: Per una fissata chiamata ricorsiva DFS(u), tutti i nodi che sono marcati Explored tra l’inizio e la fine della chiamata ricorsiva sono discendenti di u in T.

Proprietà 2: Sia T un DFS, siano x e y nodi in T si supponga (x,y) non in T. Allora x è antenato di y o viceversa.

Prova: Esempio: x = 1, y = 3. Nella chiamata di DFS(1) vengono considerati gli archi (1,2) e (1,3). Quando viene considerato l’arco (1,3), poiché non è aggiunto a T, significa che 3 è già Explored. Quindi, è stato marcato durante la chiamata DFS(1) (nella sottochiamata di DFS(2)); e per la Proprietà 1, il nodo 3 è discendente di 1.

Add (u,v) to T

Page 11: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

Alberi BFS e DFS

Albero BFS di G Albero DFS di G

Grafo G

Page 12: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

Applicazioni di BFS e DFS • Problema della connettività s-t: Dati due nodi s e t, esiste un cammino fra s e t?

• Problema del cammino minimo s-t: Dati due nodi s e t, qual è la lunghezza del cammino

minimo fra s e t?

• Problema della componente connessa di s: trovare tutti i nodi raggiungibili da s

Resta: • Problema di tutte le componenti connesse di un grafo G:

trovare tutte le componenti connesse di G

Page 13: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

Relazioni fra componenti connesse Def. La componente connessa di un grafo che contiene un nodo s è

l’insieme dei nodi raggiungibili da s. Problema: Che relazione c’è fra due componenti connesse?

Proprietà: Siano x ed y due nodi in un grafo G. Allora le componenti connesse sono identiche oppure disgiunte

13

Page 14: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

Tutte le componenti connesse Proprietà: Siano x ed y due nodi in un grafo G. Allora le componenti connesse di x e

di y sono identiche oppure disgiunte

Prova . Due casi:

– Esiste un cammino tra x e y:

(ogni nodo v raggiungibile da x

è raggiungibile da y)

– Non esiste un cammino tra x e y

(idem)

Algoritmo per trovare tutte le componenti connesse:

Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se esiste, usa BFS da v per calcolare la componente connessa di v (che è disgiunta). Ripeti.

Tempo: O(m+n)

In realtà BFS(s) richiede tempo lineare nel numero di nodi e archi della componente connessa di s.

14

Page 15: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

Altre applicazioni di BFS e DFS

• Problema della verifica se un grafo è bipartito (par. 3.4)

• Problema della connettività nei grafi diretti (par. 3.5)

… e altre ancora.

Page 16: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

3.4 Testing Bipartiteness

Page 17: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

17

Bipartite Graphs

Def. An undirected graph G = (V, E) is bipartite if the nodes can be

colored red or blue such that every edge has one red and one blue end.

Applications.

Stable marriage: men = red, women = blue.

Scheduling: machines = red, jobs = blue.

a bipartite graph

Page 18: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

18

Testing Bipartiteness

Testing bipartiteness. Given a graph G, is it bipartite?

Many graph problems become:

– easier if the underlying graph is bipartite (matching)

– tractable if the underlying graph is bipartite (independent set)

Before attempting to design an algorithm, we need to understand

structure of bipartite graphs.

v1

v2 v3

v6 v5 v4

v7

v2

v4

v5

v7

v1

v3

v6

a bipartite graph G another drawing of G

Page 19: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

19

An Obstruction to Bipartiteness

Lemma. If a graph G is bipartite, it cannot contain an odd length cycle.

Pf. Not possible to 2-color the odd cycle, let alone G.

bipartite (2-colorable)

not bipartite (not 2-colorable)

Page 20: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

20

Bipartite Graphs

Lemma. Let G be a connected graph, and let L0, …, Lk be the layers

produced by BFS starting at node s. Exactly one of the following holds.

(i) No edge of G joins two nodes of the same layer, and G is bipartite.

(ii) An edge of G joins two nodes of the same layer, and G contains an

odd-length cycle (and hence is not bipartite).

Case (i)

L1 L2 L3

Case (ii)

L1 L2 L3

Page 21: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

21

Bipartite Graphs

Lemma. Let G be a connected graph, and let L0, …, Lk be the layers

produced by BFS starting at node s. Exactly one of the following holds.

(i) No edge of G joins two nodes of the same layer, and G is bipartite.

(ii) An edge of G joins two nodes of the same layer, and G contains an

odd-length cycle (and hence is not bipartite).

Pf. (i)

Suppose no edge joins two nodes in the same layer.

By previous lemma, this implies all edges join nodes on same level.

Bipartition: red = nodes on odd levels, blue = nodes on even levels.

Case (i)

L1 L2 L3

Page 22: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

22

Bipartite Graphs

Lemma. Let G be a connected graph, and let L0, …, Lk be the layers

produced by BFS starting at node s. Exactly one of the following holds.

(i) No edge of G joins two nodes of the same layer, and G is bipartite.

(ii) An edge of G joins two nodes of the same layer, and G contains an

odd-length cycle (and hence is not bipartite).

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.

Its length is 1 + (j-i) + (j-i), which is odd. ▪

z = lca(x, y)

(x, y) path from y to z

path from z to x

Page 23: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

23

Obstruction to Bipartiteness

Corollary. A graph G is bipartite iff it contains no odd length cycle.

5-cycle C

bipartite (2-colorable)

not bipartite (not 2-colorable)

Page 24: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

3.5 Connectivity in Directed Graphs

Page 25: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

25

Directed Graphs

Directed graph. G = (V, E)

Edge (u, v) goes from node u to node v.

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.

Page 26: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

26

Graph Search

Directed reachability. Given a node s, find all nodes reachable from s.

Directed s-t shortest path problem. Given two node s and t, what is

the length of the shortest path between s and t?

Graph search. BFS extends naturally to directed graphs.

Web crawler. Start from web page s. Find all web pages linked from s,

either directly or indirectly.

Page 27: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

27

Strong Connectivity

Def. Node u and v are mutually reachable if there is a path from u to v

and also a path from v to u.

Def. A graph is strongly connected if every pair of nodes is mutually

reachable.

Lemma. Let s be any node. G is strongly connected iff every node is

reachable from s, and s is reachable from every node.

Pf. Follows from definition.

Pf. Path from u to v: concatenate u-s path with s-v path.

Path from v to u: concatenate v-s path with s-u path. ▪

s

v

u

ok if paths overlap

Page 28: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

28

Strong Connectivity: Algorithm

Theorem. Can determine if G is strongly connected in O(m + n) time.

Pf.

Pick any node s.

Run BFS from s in G.

Run BFS from s in Grev.

Return true iff all nodes reached in both BFS executions.

Correctness follows immediately from previous lemma. ▪

reverse orientation of every edge in G

strongly connected not strongly connected

Page 29: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

3.6 DAGs and Topological Ordering

Page 30: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

30

Directed Acyclic Graphs

Def. An DAG is a directed graph that contains no directed cycles.

Ex. Precedence constraints: edge (vi, vj) means vi must precede vj.

Def. A topological order of a directed graph G = (V, E) is an ordering

of its nodes as v1, v2, …, vn so that for every edge (vi, vj) we have i < j.

a DAG a topological ordering

v2 v3

v6 v5 v4

v7 v1

v1 v2 v3 v4 v5 v6 v7

Page 31: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

31

Precedence Constraints

Precedence constraints. Edge (vi, vj) means task vi must occur before vj.

Applications.

Course prerequisite graph: course vi must be taken before vj.

Compilation: module vi must be compiled before vj. Pipeline of

computing jobs: output of job vi needed to determine input of job vj.

Page 32: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

32

Directed Acyclic Graphs

Lemma. If G has a topological order, then G is a DAG.

Pf. (by contradiction)

Suppose that G has a topological order v1, …, vn and that G also has a

directed cycle C. Let's see what happens.

Let vi be the lowest-indexed node in C, and let vj be the node just

before vi; thus (vj, vi) is an edge.

By our choice of i, we have i < j.

On the other hand, since (vj, vi) is an edge and v1, …, vn is a

topological order, we must have j < i, a contradiction. ▪

v1 vi vj vn

the supposed topological order: v1, …, vn

the directed cycle C

Page 33: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

33

Directed Acyclic Graphs

Lemma. If G has a topological order, then G is a DAG.

Q. Does every DAG have a topological ordering?

Q. If so, how do we compute one?

Page 34: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

34

Directed Acyclic Graphs

Lemma. If G is a DAG, then G has a node with no incoming edges.

Pf. (by contradiction)

Suppose that G is a DAG and every node has at least one incoming

edge. Let's see what happens.

Pick any node v, and begin following edges backward from v. Since v

has at least one incoming edge (u, v) we can walk backward to u.

Then, since u has at least one incoming edge (x, u), we can walk

backward to x.

Repeat until we visit a node, say w, twice.

Let C denote the sequence of nodes encountered between

successive visits to w. C is a cycle. ▪

w x u v

Page 35: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

35

Directed Acyclic Graphs

Lemma. If G is a DAG, then G has a topological ordering.

Pf. (by induction on n)

Base case: true if n = 1.

Given DAG on n > 1 nodes, find a node v with no incoming edges.

G - { v } is a DAG, since deleting v cannot create cycles.

By inductive hypothesis, G - { v } has a topological ordering.

Place v first in topological ordering; then append nodes of G - { v }

in topological order. This is valid since v has no incoming edges. ▪

DAG

v

Page 36: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

Esempio dell’algoritmo

Page 37: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

37

Topological Sorting Algorithm: Running Time

Theorem. Algorithm finds a topological order in O(m + n) time.

Pf.

Maintain the following information:

– count[w] = remaining number of incoming edges

– S = set of remaining nodes with no incoming edges

Initialization: O(m + n) via single scan through graph.

Update: to delete v

– remove v from S

– decrement count[w] for all edges from v to w, and add w to S if c

count[w] hits 0

– this is O(1) per edge ▪

Page 38: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

Figure 3.9, 3.10

Solved Exercise 1, page 104

Page 39: Visite (BFS) DFS e applicazioni DAG e ordinamento topologico · Partendo da s qualsiasi, usa BFS (o DFS) per generare la componente connessa di s. Trova un nodo v non visitato. Se

39

Exercise 1, page 107