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 vG 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 vG vG ∑ d(v)=2m vG 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