Issuu on Google+

27/11/2008

Algoritmi e Strutture Dati Grafi

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.

1

© Alberto Montresor

Esempi di grafi

a

b

e1 e

© Alberto Montresor

d

v4

v1

c

v2

e4

e2 e3

v3

v5

2

1


27/11/2008

Problemi sui grafi 

Visite 

Visite in ampiezza (cammini minimi singola sorgente) Visite in profondità (ordinamento topologico, componenti fortemente connesse)

Cammini minimi 

Da singola sorgente

Fra tutte le coppie di vertici

Alberi di connessione minimi

Problemi di flusso

3

© Alberto Montresor

Grafo orientato: definizione 

Un grafo orientato G è una coppia (V, E) dove: 

V è un insieme finito detto insieme dei vertici

E è una relazione binaria tra vertici detta insieme degli archi

B

V = {A, B, C, D, E, F} E ={(A,B), (A,D), (B,C), (D,C), (E,C),(D,E), (D,A)}

C

A F D

© Alberto Montresor

E

(A,D) e (D,A) denotano due archi diversi 4

2


27/11/2008

Grafo non orientato: definizione 

Un grafo non orientato G è una coppia (V, E) dove: 

V è un insieme finito detto insieme dei vertici E è un insieme di coppie non ordinate di vertici detto insieme degli archi

B

A

V = {A, B, C, D, E, F} E = { {A,B}, {A,D}, {B,C}, {C,D}, {C,E}, {D,E} }

C

F D

E

5

© Alberto Montresor

Definizioni: incidenza e adiacenza 

In un grafo orientato, un arco (w,v) si dice incidente da w in v

Un vertice w si dice adiacente a v se e solo se (v, w)  E

•(A,B) è incidente da A a B •(A,D) è incidente da A a D •(D,A) è incidente da D a A B

C

A F D

© Alberto Montresor

E

• B è adiacente ad A • C è adiacente a B e a D • A è adiacente a D e vice versa • B NON è adiacente a D NÉ a C • F NON è adiacente ad alcun vertice 6

3


27/11/2008

Definizioni: adiacenza 

In un grafo non orientato la relazione di adiacenza tra vertici è simmetrica

B

A

• A è adiacente a D e vice versa • B è adiacente a A e vice versa • F NON è adiacente ad alcun vertice

C

F D

E

7

© Alberto Montresor

Rappresentazione grafi 

Ci sono due tipi standard di rappresentazioni di grafi in un computer: 

Matrice di adiacenza 

Spazio richiesto O(|V|2)

Verificare se i vertici u e v sono adiacenti richiede tempo O(1)

Molti 0 nel caso di grafi sparsi

Liste di adiacenza

© Alberto Montresor

Spazio richiesto O(|E|+|V|)

Verificare se i vertici u e v sono adiacenti richiede tempo O(|V|)

8

4


27/11/2008

Matrice di adiacenza: grafo non orientato

M(v, w) =

1

se (v, w)  E

0

altrimenti

B A

C

F D

E

Spazio: |V|2 o |V|2/2 A

B

C

D

E

F

A

0

1

0

1

0

0

B

1

0

1

0

0

0

C

0

1

0

1

1

0

D

1

0

1

0

1

0

E

0

0

1

1

0

0

F

0

0

0

0

0

0 9

© Alberto Montresor

Liste di adiacenza: grafo non orientato 

Adj(v) = { w : (v,w)  E } Spazio: a |V| + 2 b |E|

a

B A

C

F D

© Alberto Montresor

E

b

A

B

D

B

A

C

C

B

D

E

D

A

C

E

E

C

D

F 10

5


27/11/2008

Matrice di adiacenza: grafo orientato

Spazio: |V|2

B

C

A F D

E

A

B

C

D

E

F

0

1

0

1

0

0

0

0

1

0

0

0

0

0

0

0

1

0

1

0

1

0

0

0

0

0

0

1

0

0

11

Š Alberto Montresor

Lista di adiacenza: grafo orientato

Spazio: a |V| + b |E| a B

C

A F D

E

b

A

B

B

C

C

E

D

A

E

D

D

C

F Š Alberto Montresor

12

6


27/11/2008

Grafi pesati 

In alcuni casi ogni arco ha un peso (o costo) associato Il costo può essere determinato tramite una funzione di costo c: E  R, dove R è l’insieme dei numeri reali Quando tra due vertici non esiste un arco, si dice che il costo è infinito

3

4

B

Esempio: c(C,F) = ∞ C

A

4

1

7 –2

D

F

E 13

© Alberto Montresor

Matrice di adiacenza in grafi pesati

c(v,w) se (v, w)  E

M(v, w) =

3 A

C

4

1 D

© Alberto Montresor

* (nil) altrimenti

4

B

Spazio: |V|2 o |V|2/2

7 –2

E

F

A

B

C

D

E

F

A

*

3

*

1

*

*

B

3

*

4

*

*

*

C

*

4

*

4

7

*

D

1

*

4

*

-2

*

E

*

*

7

-2

*

*

F

*

*

*

*

*

* 14

7


27/11/2008

Definizioni: grado 

In un grafo non orientato, il grado di un vertice è il numero di archi che da esso si dipartono

B A

• A, B ed E hanno grado 2 • C e D hanno grado 3 • F ha grado 0 C

F D

E

15

© Alberto Montresor

Definizioni: grado 

In un grafo orientato, il grado entrante (uscente) di un vertice è il numero di archi incidenti in (da) esso In un grafo orientato il grado di un vertice è la somma del suo grado entrante e del suo grado uscente

B

• A ha g. u. 2 e g. e. 1 • B ha g. u. 1 e g. e. 1 • C ha g. u. 0 e g. e. 3 • D ha g. u. 3 e g. e. 1

C

A F D

© Alberto Montresor

E

• A e C hanno grado 3 • B ha grado 2 • D ha grado 4 16

8


27/11/2008

Sottografo 

Sia G = (V, E) un grafo. Un sottografo di G è un grafo H = (V*, E*) tale che V*  V e E*  E

Esempio: V* = {A, C, D}, B

E* = {(C, D)}.

C

A F D

E 17

© Alberto Montresor

Sottografo indotto 

Sia G = (V, E) un grafo e V*  V un insieme di vertici. Il sottografo di G indotto da V* è il grafo H=(V*, E*) tale che E* = {(w,v) | (w,v)  E , w,v  V*} Sia G = (V, E) un grafo. Il sottografo H=(V*, E*) di G è detto di supporto se: V* = V

B

B

C

A

A

C

F F D

© Alberto Montresor

B

D

E 18

9


27/11/2008

Cammini 

Sia G = (V, E) un grafo. Un cammino nel grafo è una sequenza di vertici <w0, w1, ..., wn> tale che (wi, wi+1)  E per 0 ≤ i ≤ n–1 Il cammino <w1, w2, ..., wn> si dice contenere i vertici w0 , w1 ,…, wn e gli archi (w0,w1) (w1,w2) ...(wn-1,wn)

B

Esempio: <A, B, C, E> è un cammino nel grafo

C

A

F D

E 19

© Alberto Montresor

Cammini 

Sia <w0 , w1 , . . . , wn> un cammino in un grafo orientato. Poiché ogni arco (wi, wi+1) nel cammino è ordinato, gli archi del cammino sono sempre orientati lungo il percorso.

B

C

A F D

© Alberto Montresor

Esempio: <A, B, C, E> è un cammino in questo grafo orientato <A, B, C, D> non è un cammino, poiché (C, D) non è un arco

E

20

10


27/11/2008

Cammini 

Sia <w0, w1, . . . , wn> un cammino La lunghezza del cammino è il numero totale di archi che connettono i vertici nell’ordine della sequenza (n, uno in meno del numero di vertici nella sequenza). Esempio: la lunghezza del cammino <A, B, C, E> è 3.

B

C

A

F D

E 21

© Alberto Montresor

Cammini 

Un cammino si dice semplice se tutti i suoi vertici sono distinti (compaiono una sola volta nella sequenza) B

Es., il cammino <A, B, C, E> è semplice ...

C

A F D

© Alberto Montresor

E

... ma il cammino <A, B, C, E, D, C > non è semplice, poiché C è ripetuto.

22

11


27/11/2008

Cammini 

Se esiste un cammino c tra i vertici v e w, si dice che w è raggiungibile da v tramite c

Es.: A è raggiungibile da D ma non viceversa

Esempio: A è raggiungibile da D e viceversa B

B

C

A

C

A

D

D

E

E 23

© Alberto Montresor

Grafi connessi 

Se G è un grafo non orientato, diciamo che G è connesso se esiste un cammino da ogni vertice ad ogni altro vertice. B

Questo grafo non orientato è connesso. B A

A

F C

D

F D

© Alberto Montresor

C

E

E

Questo grafo non orientato non è connesso.

24

12


27/11/2008

Grafi fortemente connessi 

Se G è un grafo orientato, diciamo che G è fortemente connesso se esiste un cammino da ogni vertice ad ogni altro vertice. Questo grafo orientato non è fortemente connesso; ad es., non esiste cammino da D a A.

Questo grafo orientato è fortemente connesso. B

B

C

A

C

A F D

F D

E

E 25

© Alberto Montresor

Versione non orientata 

Se G è un grafo orientato, il grafo ottenuto ignorando la direzione degli archi e i cappi è detto il grafo non orientato sottostante o anche versione non orientata di G. B A

C F

D

E

B A

C F

D © Alberto Montresor

E 26

13


27/11/2008

Versione orientata 

Se G è un grafo non orientato, il grafo ottenuto inserendo due archi orientati per ogni arco non orientato del grafo è detto la versione orientata di G. B A

C F

D

E

B A

C F

D

E 27

© Alberto Montresor

Grafi debolmente connessi 

Se G è un grafo orientato che non è fortemente connesso, ma il grafo sottostante (senza la direzione degli archi) è connesso, diciamo che G è debolmente connesso

B

Questo grafo orientato non è fortemente connesso, ma è debolmente connesso

C

A F D

© Alberto Montresor

E

28

14


27/11/2008

Cicli 

Un ciclo in un grafo orientato è un cammino <w0, w1, …, wn> di lunghezza almeno 3, tale che w0 = wn Un ciclo è semplice se i nodi w1, ..., wn-1 sono tutti distinti

B

Es.: il cammino <A, B, C, E, D, A> è un ciclo semplice

C

A

D

E 29

© Alberto Montresor

Grafi aciclici 

Un grafo senza cicli è detto aciclico. B A

Un grafo orientato aciclico è spesso chiamato DAG (Directed Acyclic Graph).

C

Questo grafo è aciclico.

F B

D

E B

A

A F C D

Questo grafo non è aciclico. D

© Alberto Montresor

C

F E

E

30

15


27/11/2008

Grafo completo Un grafo completo è un grafo che ha un arco tra ogni coppia di vertici. Questo grafo è completo

B Questo grafo non è completo B

A

C

A

C D 2

V n ( n  1 ) V i   2 2 i 1

n  1

D

E

E

31

© Alberto Montresor

Alberi Un albero libero è un grafo non orientato connesso, aciclico.

Se qualche vertice è designato ad essere la radice, otteniamo un albero radicato.

Questo è un albero libero B A

B

C A

C

F D

© Alberto Montresor

E

F D

E 32

16


27/11/2008

Attraversamento grafi 

Definizione del problema 

Dato un grafo G=<V,E> ed un vertice s di V (detto sorgente), visitare ogni vertice raggiungibile nel grafo dal vertice s Ogni nodo deve essere visitato una volta sola

Visita in ampiezza (breadth-first search) 

Visita i nodi “espandendo” la frontiera fra nodi scoperti e da scoprire

Esempio: cammini più brevi da singola sorgente

Visita in profondità (depth-first search) 

Visita i nodi andando il “più lontano possibile” nel grafo Esempio: componenti fortemente connesse, ordinamento topologico 33

© Alberto Montresor

Visita: attenzione alle soluzioni “facili” 

Prendere ispirazione dalla visita degli alberi

Ad esempio: 

utilizziamo una visita BFS basata su coda

trattiamo i “vertici adiacenti” come se fossero i “figli”

non-visita(G, s) coda := {s} while coda  ∅ do u = coda.dequeue() “visita u” for each v in u.adj do coda.enqueue(v)

© Alberto Montresor

u.adj contiene la lista di adiacenza di u

34

17


27/11/2008

Esempio di visita

F

s

B

C

I

A M D

E

L

H

G Coda:{F} 35

Š Alberto Montresor

Esempio di visita

F B

s

u = F

C

I

A M D

E

H

L

G Coda:{B,D,I} Š Alberto Montresor

36

18


27/11/2008

Esempio di visita

F

s

B

u = B

C

I

A M D

E

L

H

G Coda:{D,I,C,A,F} 37

Š Alberto Montresor

Esempio di visita

F B

s

u = D

C

I

A M D

E

H

L

G Coda:{I,C,A,F,E,F,A,C} Š Alberto Montresor

38

19


27/11/2008

Esempio di visita

F B

s

u = I

C

I

A M D

E

L

H

Nodi già visitati  “Marcare” un nodo visitato in modo che non possa essere visitato di nuovo Coda:{C,A,F,E,F,A,C,H,F}  Bit di marcatura: nel vertice, array separato, etc. 

G

39

© Alberto Montresor

Algoritmo generico per la visita visita(G, s) rendi “non marcati” tutti i vertici inizializza l'albero T F := { s } “marca” il vertice s while F  ∅ do u = F.extract() “visita il vertice u” for each v in u.adj do if (v non è marcato) then marca il vertice v F.insert(v) v.pred = u return T

© Alberto Montresor

F è l'insieme frontiera Il funzionamento di extract() e insert() non è specificato T è l'albero che viene costruito dalla visita v.pred è il padre di v nell'albero T

40

20


27/11/2008

Algoritmo generico per la visita 

Alcune definizioni 

L'albero T contiene i vertici visitati F è un sottoinsieme di T che contiene vertici aperti: vertici i cui archi uscenti non sono ancora stati percorsi T-F è un sottoinsieme di T che contiene i vertici chiusi: vertici i cui archi uscenti sono tutti stati percorsi V-T contiene i vertici non visitati Se u compare lungo il cammino che va dalla radice s alla nodo v, diciamo che: 

u è un antenato di v

v è un discendente di u 41

© Alberto Montresor

Algoritmo generico per la visita 

Alcune cose da notare: 

I nodi vengono visitati al più una volta (marcatura)

Tutti i nodi raggiungibili da s vengono visitati

Ne segue che T è un albero che contiene esattamente tutti i nodi raggiungibili da s La visita avviene in base all'ordine di estrazione

Complessità 

O(kV+E)

liste di adiacenza dove k è il costo di insert()/extract() nell'insieme

O(kV2)

matrice di adiacenza dove k è il costo di insert()/extract() nell'insieme

© Alberto Montresor

42

21


27/11/2008

Visita in ampiezza (breadth first search, BFS) 

Cosa vogliamo fare? 

Visitare i nodi a distanze crescenti dalla sorgente visitare i nodi a distanza k prima di visitare i nodi a distanza k+1

Generare un albero BF (breadth-first) albero contenente tutti i vertici raggiungibili da s e tale che il cammino da s ad un nodo nell'albero corrisponde al cammino più breve nel grafo

Calcolare la distanza minima da s a tutti i vertici raggiungibili

numero di archi attraversati per andare da s ad un vertice

43

© Alberto Montresor

Visita in ampiezza (breadth first search, BFS) BFS(G, s) for each v in V do v.mark := false T := s F := new Queue() F.enqueue(s) s.mark := true s.dist := 0 while F  ∅ do u = F.dequeue() “visita il vertice u” for each v in u.adj do if (not v.mark) then v.mark = true v.dist = v.dist+1 F.enqueue(v) v.pred := u return T © Alberto Montresor

Insieme F gestito tramite una coda v.mark è la marcatura del nodo v v.distance è la distanza del nodo v dal vertice s

44

22


27/11/2008

Esempio

F B

C

I

s=F

A M D

E

H

L

G Coda:{F} 45

Š Alberto Montresor

Esempio

F B

C

I

s=F

A M D

E

H

L

G Coda:{B,D,I} Š Alberto Montresor

46

23


27/11/2008

Esempio

F B

C

I

s=F

A M D

E

H

L

G Coda:{D,I,C,A} 47

Š Alberto Montresor

Esempio

F B

C

I

s=F

A M D

E

H

L

G Coda:{I,C,A,E} Š Alberto Montresor

48

24


27/11/2008

Esempio

F B

C

I

s=F

A M D

E

H

L

G Coda:{C,A,E,H} 49

Š Alberto Montresor

Esempio

F B

C

I

s=F

A M D

E

H

L

G Coda:{A,E,H} Š Alberto Montresor

50

25


27/11/2008

Esempio

F B

C

I

s=F

A M D

E

H

L

G Coda:{E,H} 51

Š Alberto Montresor

Esempio

F B

C

I

s=F

A M D

E

H

L

G Coda:{H,G} Š Alberto Montresor

52

26


27/11/2008

Esempio

F B

C

I

s=F

A M D

E

H

L

G Coda:{G} 53

Š Alberto Montresor

Esempio

F B

C

I

s=F

A M D

E

H

L

G Coda:{} Š Alberto Montresor

54

27


27/11/2008

Esempio 0 1

F 1

B

C 2

A 2

I

s=F M

1 D

E 2 2

H

L

G 3 Coda:{} © Alberto Montresor

55

Applicazioni 

La visita BFS può essere utilizzata per ottenere il percorso più breve fra due vertici

print-path(G, s,v) if v = s then print s else if v.pred = NIL then print “no path from s to v” else print-path(G,s,v.pred) print v

© Alberto Montresor

56

28


27/11/2008

Visita in profondità (depth first search, DFS) 

Visita in profondità 

E' spesso una “subroutine” della soluzione di altri problemi Utilizzata per coprire l'intero grafo, non solo i nodi raggiungibili da una singola sorgente (unlike BFS)

Output 

Invece di un albero, una foresta DF (depth-first) Gπ=(V,Eπ) 

Contenente un insieme di alberi DF

Informazioni addizionali sul tempo di visita 

Tempo di scoperta di un nodo

Tempo di “terminazione” di un nodo

57

© Alberto Montresor

Visita in profondità (depth first search, DFS) DFS(G, s) for each u in V do u.mark := white u.pred := NIL time := 0 for each u in V do if u.mark=white then DFS-visit(u) DFS-visit(u) u.mark := gray u.dt := time := time+1 for each v in u.adj do if v.mark = white then v.pred = u DFS-visit(v) “visita il vertice u” u.ft := time := time+1 u.mark = black © Alberto Montresor

Ricorsione al posto di uno stack time è una variabile globale che contiene il numero di “passi” dell'algoritmo v.dt (discovery time): è il tempo in cui il nodo è stato scoperto

v.ft (finish time): è il tempo in cui il nodo è stato visitato 58

29


27/11/2008

Esempio

F B

C

I

A M D

E

H

L

G

59

Š Alberto Montresor

Esempio

F B

C

I

A M D

E

H

L

G

Š Alberto Montresor

60

30


27/11/2008

Esempio

F B

C

I

A M D

E

H

L

G

61

Š Alberto Montresor

Esempio

F B

C

I

A M D

E

H

L

G

Š Alberto Montresor

62

31


27/11/2008

Esempio

F B

C

I

A M D

E

H

L

G

63

Š Alberto Montresor

Esempio

F B

C

I

A M D

E

H

L

G

Š Alberto Montresor

64

32


27/11/2008

Esempio

F B

C

I

A M D

E

H

L

G

65

Š Alberto Montresor

Esempio

F B

C

I

A M D

E

H

L

G

Š Alberto Montresor

66

33


27/11/2008

Esempio

F B

C

I

A M D

E

L

H

G

67

Š Alberto Montresor

Esempio

F B

C

I

A M D

E

H

L

G

Š Alberto Montresor

68

34


27/11/2008

Esempio

F B

C

I

A M D

E

H

L

G

© Alberto Montresor

69

Proprietà della visita DF – Teorema delle parentesi 

In qualsiasi visita di profondità di un grafo G=(V,E), per ogni coppia di vertici u,v, una sola delle seguenti condizioni è vera: 

Gli intervalli [u.dt, u.ft] e [v.dt, v.ft] sono disgiunti u,v non sono discendenti l'uno dell'altro nella foresta DF L'intervallo [u.dt, u.ft] è interamente contenuto in [v.dt, v.ft] u è discendente di v in un albero DF L'intervallo [v.dt, v.ft] è interamente contenuto in [u.dt, u.ft] v è discendente di u in un albero DF

Corollario 

Il vertice v è un discendente del vertice u nella foresta DF per un grafo G se e soltanto se: u.dt < v.dt < d.ft < u.ft

© Alberto Montresor

70

35


27/11/2008

Proprietà della visita DF – Teorema del cammino bianco 

In una foresta DF di un grafo G=(V,E): 

il vertice v è un discendente del vertice u

 

al tempo u.dt in cui viene scoperto, il vertice v può essere raggiunto da u lungo un cammino che è formato da soli nodi bianchi

71

© Alberto Montresor

Classificazione degli archi 

Sia Gπ = (V, Eπ) una foresta DF per il grafo G. Un arco (u,v) di G può essere classificato come: 

Archi d'albero 

Archi all'indietro 

archi che collegano u ad un antenato v in un albero DF

Archi in avanti 

(u,v)  Eπ

archi che collegano u ad un discendente v in un albero DF, ma (u,v)  Eπ

Archi trasversali 

© Alberto Montresor

tutti gli altri archi. Esempi?

72

36


27/11/2008

Classificazione degli archi 

Come classificare? Sia (u,v) un arco visitato. Allora 

se v è WHITE: arco d'albero

se v è GRAY: arco all'indietro

se v è BLACK: 

u.dt < v.dt: arco trasversale

v.dt < u.dt: arco in avanti

Cosa serve le classificazione? 

E' possibile dimostrare alcune proprietà, che poi possono essere sfruttate negli algoritmi Esempio: DAG non hanno archi all'indietro

73

© Alberto Montresor

Applicazioni DFS 

Due problemi: 

calcolare l’ordinamento topologico indotto da un grafo aciclico

individuare 

le componenti connesse di un grafo non orientato

le componenti fortemente connesse di un grafo orientato

Vedremo che entrambi i problemi possono essere risolti impiegando opportunamente l’algoritmo DFS

© Alberto Montresor

74

37


27/11/2008

Ordinamento topologico 

Dato un DAG G (direct acyclic graph), un ordinamento topologico su G è un ordinamento lineare dei suoi vertici tale per cui: 

se G contiene l’arco (u,v), allora u compare prima di v nell’ordinamento Per transitività, ne consegue che se v è raggiungibile da u, allora u compare prima di v nell'ordinamento Nota: possono esserci più ordinamenti topologici

v u

u

w

v

x

y

u

v

w

y

x

x

w

y 75

© Alberto Montresor

Ordinamento topologico 

Problema: 

Fornire un algoritmo che dato un grafo orientato aciclico, ritorni un ordinamento topologico

Soluzioni 

Diretta

Basata su DFS

© Alberto Montresor

1) Trovare ogni vertice che non ha alcun arco incidente in ingresso 2) Stampare questo vertice e rimuoverlo, insieme ai suoi archi 3) Ripetere la procedura finché tutti i vertici risultano rimossi. Esercizio: scrivere lo pseudocodice per questo algoritmo, che operi in tempo O(V+E) 76

38


27/11/2008

Soluzione diretta v

v x

w

u

v x

w

y

y

y

output: u

output:

x

output: u w

v x

x

output: u w y

output: u w y v

output: u w y v x

77

Š Alberto Montresor

Ordinamento topologico basato su DFS topological-sort(G) - DFS(G) per calcolare i tempi v.ft - (si la visita ottengono consiste i valori nell'aggiungere dt,ft) - il l'operazione vertice alla di testa visitadi consiste una lista - nell'aggiungere restituire la lista il vertice di vertici alla testa di una lista - restituire la lista di vertici

v u

x

w

y v 6/9

u

v

x

w

y u 1/10 w 2/5

x 7/8

output: u v x w y y 3/4

Š Alberto Montresor

78

39


27/11/2008

Ordinamento topologico basato su DFS 

Teorema: 

Un grafo orientato è aciclico se e solo se DFS su G non trova alcun arco di ritorno

Teorema: 

L'algoritmo basato su DFS produce correttamente l’ordinamento topologico di un grafo aciclico G.

© Alberto Montresor

79

Componenti (fortemente) connesse 

Terminologia 

Componenti connesse (connected components, CC)

Componenti fortemente connesse (strongly connected components, SCC)

Motivazioni 

Molti algoritmi che operano sui grafi iniziano decomponendo il grafo nelle sue componenti

L'algoritmo viene poi eseguito su ognuna delle componenti

I risultati vengono poi ricomposti assieme

© Alberto Montresor

80

40


27/11/2008

Componenti connesse 

Un sottografo massimale connesso di un grafo non orientato G si dice componente connessa di G. Un sottografo connesso H di G è “massimale” se 

non si possono aggiungere ad H altri vertici o archi in modo che il grafo risultante sia ancora un sottografo connesso di G f

f

b

a e

c

f b

a g

d

e

c

G

g d

H1

b

H2

g d

H3?

© Alberto Montresor

81

Componenti connesse 

Per testare se un grafo non orientato è connesso possiamo: 

usare l’algoritmo DFS()

il grafo è connesso se e solo se una chiamata di DFS() raggiungerà tutti i vertici. In effetti una chiamata di DFS-visit() raggiungerà tutti i vertici contenuti esattamente in una componente connessa

Es. 23.3.9: Mostrare che DFS su un grafo non orientato G può essere usata per identificare le componenti connesse e che la foresta DF contiene tanti alberi quante CC. Modificare DFS in modo che ogni vertice sia etichettato con cc[v] tra 1 e k (k numero di CC) in modo che cc[u]=cc[v] se e solo se u e v se appartengono alla stessa CC.

© Alberto Montresor

82

41


27/11/2008

Esercizio CC(G, s) for each u in V do u.cc := -1 u.pred := NIL k := 0 for each u in V do if u.cc < 0 then CC-visit(u,k) k := k+1 CC-visit(u, k) u.cc := k for each v in u.adj do if v.mark = false then v.pred = u DFS-visit(v) 83

© Alberto Montresor

Componenti fortemente connesse Un sottografo massimale fortemente connesso di un grafo non orientato G si dice componente fortemente connessa di G.

Un sottografo fortemente connesso H di G è “massimale” se

non si possono aggiungere ad H altri vertici o archi in modo che il grafo risultante sia ancora un sottografo fortemente connesso di G

f a

c

e

G © Alberto Montresor

f

b

a g

d

b g

e

c

d

H1

H2

H3 84

42


27/11/2008

Algoritmo

1 DFS(G) 2 Calcola il grafo trasposto GT 3 DFS(GT) ma esaminando i vertici in ordine decrescente di tempo f[v] di fine visita 4 fornisci i vertici di ogni albero della foresta DF prodotta al passo 3 come una diversa CFC

© Alberto Montresor

85

Altre applicazioni di DFS 

Caratterizzazione di alcune importanti proprietà dei grafi (non orientati):  Ciclo di Eulero  Ciclo in un grafo G che visita ogni arco di G una volta 

Ciclo di Hamilton  Ciclo in un grafo G che visita ogni nodo di G una volta

© Alberto Montresor

86

43


27/11/2008

Caratterizzazione di un ciclo Euleriano 

Un vertice v si dice dispari se il grado di v è dispari.

Un vertice v si dice pari se il grado di v è pari.

Teorema 

Sia G un grafo connesso.G ha un circuito di Eulero se e solo se ogni suo vertice è pari

Dimostrazione 

Se esiste un ciclo Euleriano, ogni volta che un nodo viene visitato, deve esserci un arco entrante e uno uscente. Se tutti i nodi hanno grado pari, mostriamo un algoritmo in grado di costruire un ciclo di eulero

© Alberto Montresor

87

Algoritmo

Usiamo DFS per trovare i circuiti, eliminando via via ogni arco attraversato. Appena ritorniamo al vertice di partenza, se esistono altri archi, scegliamo uno dei vertici del ciclo trovato per cui esiste ancora un arco. Altrimenti va al passo  Torniamo al passo  Fondiamo, nei vertici comuni, i circuiti trovati in un unico circuito come visto prima.

© Alberto Montresor

88

44


27/11/2008

Fusione di cicli

© Alberto Montresor

89

Cicli hamiltoniani 

Un ciclo Hamiltoniano di un grafo G è un ciclo in G che visita ogni vertice di G esattamente una volta. Applicazione: Il commesso viaggiatore. Trovare un ciclo Hamiltoniano in un grafo è un problema “computazionalmente difficile”

© Alberto Montresor

90

45


Prova