Algoritmi e Strutture Dati
Grafi
Algoritmi e strutture dati 2/ed
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Definizione
Un grafo G=(V,E) consiste in:
- un insieme V di vertici o nodi, (vertex)
- un insieme E di coppie di vertici, detti archi o
spigoli (edge): ogni arco connette due vertici
Esempio 1: V={persone che vivono in Italia},
E={coppie di persone che si sono strette la mano}
Esempio 2: V={persone che vivono in Italia},
E={(x,y) tale che x ha inviato una mail a y}
2
Copyright © 2008 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati 2/ed
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Terminologia (1/10)
Se esiste una relazione simmetrica
grafo non orientato
Accade quando la relazione tra una coppia di vertici è
simmetrica; vedi esempio 1.
3
Copyright © 2008 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati 2/ed
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Terminologia (2/10)
Se esiste una relazione “orientata”
grafo orientato o diretto
Accade quando la relazione tra una coppia di vertici è
orientata; vedi esempio 2.
4
Copyright © 2008 - The McGraw - Hill Companies, srl

Algoritmi e strutture dati 2/ed
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Terminologia (3/10)
Un grafo verrà denotato con G=(V,E), dove E  VxV
n = numero di vertici (nodi)
m = numero di spigoli (archi)
Se x e y sono due vertici di G, allora (x, y) indicherà
l’arco
• (x, y) si dice incidente a x e a y
• Se il Grafo è Orientato, si dice che (x, y) esce da x e
entra nel vertice y
• Se il Grafo NON è Orientato, si dice che x ed y sono
adiacenti
•
•
•
•
5
Copyright © 2008 - The McGraw - Hill Companies, srl

Algoritmi e strutture dati 2/ed
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Terminologia (4/10)
• Grado di un vertice v in un Grafo NON orientato è dato
dal numero di archi incidenti su v.
• Si indica con d(v)
• Esempio: H ha grado 4: d(H)=4
• La somma di tutti i gradi dei vertici è data da:
∑ d(v)=2m
vG
6
Copyright © 2008 - The McGraw - Hill Companies, srl

Algoritmi e strutture dati 2/ed
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Terminologia (5/10)
•
•
•
•
•
Grado di un vertice v in un Grafo Orientato
Si ha il grado in uscita di v e il grado in entrata di v
Si indicano con din(v) e dout(v)
Il Grado di v è d=din(v) + dout(v)
Esempio: E ha din(E)=3 e dout(E)=4, d(E)=7
• Si ha che
∑ din(v)= ∑ dout(v)=m
vG
vG
∑ d(v)=2m
vG
7
Copyright © 2008 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati 2/ed
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Terminologia (6/10)
• Un Cammino in G dal vertice x al vertice y è una sequenza
di vertici (v0, v1, v2, ……, vk) con v0=x e vk=y, tale che:
(vi-1, vi) appartiene a G per qualunque 1≤i≤k
• Il cammino ha lunghezza k (numero di vertex – 1)
• Esempio:< L , I , E, C, B, A > è un cammino di lunghezza 5
• Si dice che il cammino è semplice se tutti i
vertici sono distinti
• Esempio: il cammino tra A e L esiste,
contiene (A, B, E, I, L), e gli archi (A,B)(B,E)-(E,I)-(I,L), ha lunghezza 4, ed è
semplice
8
Copyright © 2008 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati 2/ed
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Terminologia (7/10)
• Esempio: il cammino tra A e L esiste,
contiene (A, B, C, E, F, H, E, I, L), e gli
archi (A,B)-(B,C)-(C,E)-(E,F)-(F,H)-(H,E)(E,I)-(I,L), ha lunghezza 8, e NON è
semplice (passa due volte da E)
9
Copyright © 2008 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati 2/ed
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Terminologia (8/10)
• Se esiste un cammino da un vertice x ad un vertice y, si
dice che y è raggiungibile da x, ossia che y è discendente
di x e che x è un antenato di y
• Un cammino (v0, v1, v2, ……, vk) tale che v0=vk e k≥1 si
dice un ciclo
• Un ciclo è semplice se i vertici sono distinti
• Un Grafo Diretto Aciclico è un grafo orientato che non
contiene cicli
10
Copyright © 2008 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati 2/ed
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Terminologia (9/10)
(B,C,E,D,B) è un ciclo semplice
(E,F,H,E,I,G,E) non è semplice
11
Copyright © 2008 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati 2/ed
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Terminologia (10/10)
• Un Grafo NON orientato G=(V,E) si dice connesso se
esiste un cammino tra ogni coppia di vertici in G
• Per essere connesso un Grafo deve avere almeno (n-1)
archi
• Un Grafo Orientato si dice fortemente connesso se esiste
un cammino tra ogni coppia di vertici
12
Copyright © 2008 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati 2/ed
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Operazioni sui Grafi
13
Copyright © 2008 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati 2/ed
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Alcune Operazioni
• unsigned int grado(vertex v);
– numero di archi incidenti su v
• edge[] archiIncidenti(vertex v);
– lista/vettore di archi incidenti su v
• boolean sonoAdiacenti(vertex u, vertex v);
– TRUE se esiste l’arco (u,v)
• void aggiungiVertice(vertex v);
– inserisce un nuovo vertice v
• void aggiungiArco(vertex u, vertex v);
– inserisce un nuovo arco tra i vertici u e v
• void rimuoviVertice(vertex v);
• void rimuoviArco(edge e);
14
Copyright © 2008 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati 2/ed
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Strutture dati
per rappresentare grafi
15
Copyright © 2008 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati 2/ed
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Lista di Archi
Più struttura dati per
memorizzare vertex
16
Copyright © 2008 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati 2/ed
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Liste di Adiacenza
17
Copyright © 2008 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati 2/ed
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Liste di Incidenza
18
Copyright © 2008 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati 2/ed
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Matrice di Adiacenza
19
Copyright © 2008 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati 2/ed
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Matrice di Incidenza
20
Copyright © 2008 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati 2/ed
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Implementazione in C
di un Grafo con Liste di Adiacenza
21
Copyright © 2008 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati 2/ed
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Liste di Adiacenza
graph
0
nv
vect
1
2
0
3
1
4
3
22
4
v
present
adj
v
present
adj
v
present
adj
v
present
adj
v
present
adj
1
2
3
v next
v next
v next
0
3
v next
v next
0
v next
v next
v next
1
0
2
Copyright © 2008 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati 2/ed
#define EMPTYGRAPH
NULL
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Liste di Adiacenza
typedef int boolean;
typedef unsigned int vertex;
typedef vertex edge[2];
typedef struct node_edge{
vertex v;
struct node_edge *next;
} node_edge;
typedef struct node_vertex{
vertex v;
boolean present;
node_edge *adj; /* lista di adiacenze del vertex v*/
} node_vertex;
typedef struct node_graph {
unsigned int nv; /* numero massimo di vertici del grafo */
node_vertex *vect; /* vettore con le liste delle adiacenze */
} * graph ;
23
Copyright © 2008 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati 2/ed
graph MakeNULLGraph(unsigned int dim) {
graph G;
unsigned int i;
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Liste di Adiacenza
if (dim>0) {
G = (graph)malloc(sizeof(struct node_graph));
if (!G) printf("\nERRORE: impossibile allocare memoria per il grafo\n");
else {
G->vect=(node_vertex *)malloc(dim*sizeof(node_vertex));
if (!G->vect) {
printf("ERRORE: impossibile allocare memoria ");
printf("per il vettore di liste\n");
free(G);
G=NULL;
} else {
G->nv = dim;
for (i=0; i<dim; i++){
G->vect[i].v=i;
G->vect[i].present=0;
G->vect[i].adj=EMPTYGRAPH;
}
}
}
} else G=NULL;
return(G);
}
24
Copyright © 2008 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati 2/ed
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Liste di Adiacenza
void AddEdgeGraph(graph G, vertex u, vertex v) {
node_edge *new;
if (G && u<G->nv && v<G->nv ) {
if (G->vect[u].present && G->vect[v].present) {
new = (node_edge*)malloc(sizeof(node_edge));
if (new==NULL) printf("\nERRORE: impossibile allocare memoria \n");
else {
new->v=v;
new->next=G->vect[u].adj;
G->vect[u].adj = new;
}
}
}
}
25
Copyright © 2008 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati 2/ed
void RemoveEdgeGraph(graph G, edge e) {
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Liste di Adiacenza
node_edge *prev; /* l'arco precedente a quello da togliere nella lista */
node_edge *p; /* l'arco da togliere dalla lista */
vertex u=e[0], v=e[1];
if (G && u<G->nv && v<G->nv) {
if (G->vect[u].present && G->vect[v].present) {
26
/*eliminare l'arco da u a v*/
p=G->vect[u].adj;
if (p->v == v) {
G->vect[u].adj = p->next;
free(p);
} else {
prev=p;
while (prev->next->v != v && prev->next->next!=EMPTYGRAPH)
prev=prev->next;
if (prev->next->next!=EMPTYGRAPH) {
p=prev->next;
prev->next=p->next;
free(p);
}
Copyright © 2008 - The McGraw - Hill Companies, srl
}
Algoritmi e strutture dati 2/ed
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Liste di Adiacenza
/*eliminare l'arco da v a u*/
p=G->vect[v].adj;
if (p->v == u) {
G->vect[v].adj = p->next;
free(p);
} else {
prev=p;
while (prev->next->v != u && prev->next->next!=EMPTYGRAPH)
prev=prev->next;
if (prev->next->next!=EMPTYGRAPH) {
p=prev->next;
prev->next=p->next;
free(p);
}
}
}
}
27 }
Copyright © 2008 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati 2/ed
void AddVertexGraph(graph G, vertex v) {
node_vertex *p;
unsigned int dim;
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Liste di Adiacenza
if (G!=NULL && !G->vect[v].present)
if(v<G->nv)
G->vect[v].present=1;
else
if (v==G->nv) {
dim=G->nv+1;
p=(node_vertex *)realloc(G->vect,dim*sizeof(node_vertex));
if (!p) printf("ERRORE: impossibile reallocare memoria \n");
else {
G->vect=p;
G->nv=dim;
G->vect[v].v=v;
G->vect[v].present=1;
G->vect[v].adj=EMPTYGRAPH;
}
}
}
28
Copyright © 2008 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati 2/ed
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Liste di Adiacenza
void RemoveVertexGraph(graph G, vertex v) {
node_edge *prev; /* l'arco precedente a quello da togliere nella
lista */
node_edge *p; /* l'arco da togliere dalla lista */
unsigned int i;
else {
if (G && v<G->nv &&G->vect[v].present)
for (i=0; i<G->nv; i++) {
if (G->vect[i].v==v){
p=G->vect[i].adj;
while (p!=EMPTYGRAPH) {
prev=p;
p=p->next;
free(prev);
}
G->vect[i].adj=EMPTYGRAPH;
G->vect[i].present=0;
} else if (G->vect[i].present && G->vect[i].adj) {
p=G->vect[i].adj;
if (p->v == v) G->vect[i].adj = p->next;
}
else {
29
prev=p;
while (prev->next->v != v &&
prev->next->next!=EMPTYGRAPH)
prev=prev->next;
if (prev->next->v==v) {
p=prev->next;
prev->next=p->next;
}
}
free(p);
}
}
Copyright © 2008 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati 2/ed
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Riepilogo
• Concetto di grafo e terminologia
• Diverse strutture dati per rappresentare grafi nella
memoria di un calcolatore
• L’utilizzo di una particolare rappresentazione può
avere un impatto notevole sui tempi di esecuzione
di un algoritmo su grafi
30
Copyright © 2008 - The McGraw - Hill Companies, srl