Algoritmi e Strutture Dati Grafi Copyright 2008 The

  • Slides: 30
Download presentation
Algoritmi e Strutture Dati Grafi Copyright © 2008 - The Mc. Graw - Hill

Algoritmi e Strutture Dati Grafi Copyright © 2008 - The Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Definizione Un

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 Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Terminologia (1/10)

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 Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Terminologia (2/10)

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 Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Terminologia (3/10)

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 Vx. V 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 Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Terminologia (4/10)

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)=2 m v G 6 Copyright © 2008 - The Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Terminologia (5/10)

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 ∑ d(v)=2 m v G 7 Copyright © 2008 - The Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Terminologia (6/10)

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 (v 0, v 1, v 2, ……, vk) con v 0=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 Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Terminologia (7/10)

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 Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Terminologia (8/10)

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 (v 0, v 1, v 2, ……, vk) tale che v 0=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 Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Terminologia (9/10)

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 Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Terminologia (10/10)

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 Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Operazioni sui

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Operazioni sui Grafi 13 Copyright © 2008 - The Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Alcune Operazioni

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[] archi. Incidenti(vertex v); – lista/vettore di archi incidenti su v • boolean sono. Adiacenti(vertex u, vertex v); – TRUE se esiste l’arco (u, v) • void aggiungi. Vertice(vertex v); – inserisce un nuovo vertice v • void aggiungi. Arco(vertex u, vertex v); – inserisce un nuovo arco tra i vertici u e v • void rimuovi. Vertice(vertex v); • void rimuovi. Arco(edge e); 14 Copyright © 2008 - The Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Strutture dati

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Strutture dati per rappresentare grafi 15 Copyright © 2008 - The Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Lista di

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 Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Liste di

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Liste di Adiacenza 17 Copyright © 2008 - The Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Liste di

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Liste di Incidenza 18 Copyright © 2008 - The Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Matrice di

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Matrice di Adiacenza 19 Copyright © 2008 - The Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Matrice di

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Matrice di Incidenza 20 Copyright © 2008 - The Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Implementazione in

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 Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Liste di

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 1 2 3 v next 0 3 v next 0 v next 1 0 2 Copyright © 2008 - The Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati 2/ed #define EMPTYGRAPH NULL Camil Demetrescu, Irene Finocchi, Giuseppe F.

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 Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati 2/ed graph Make. NULLGraph(unsigned int dim) { graph G; unsigned

Algoritmi e strutture dati 2/ed graph Make. NULLGraph(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("n. ERRORE: impossibile allocare memoria per il grafon"); else { G->vect=(node_vertex *)malloc(dim*sizeof(node_vertex)); if (!G->vect) { printf("ERRORE: impossibile allocare memoria "); printf("per il vettore di listen"); 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 Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Liste di

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Liste di Adiacenza void Add. Edge. Graph(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("n. ERRORE: impossibile allocare memoria n"); else { new->v=v; new->next=G->vect[u]. adj; G->vect[u]. adj = new; } } 25 Copyright © 2008 - The Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati 2/ed void Remove. Edge. Graph(graph G, edge e) { Camil

Algoritmi e strutture dati 2/ed void Remove. Edge. Graph(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!=EMPTYGRAPH) prev=prev->next; if (prev->next!=EMPTYGRAPH) { p=prev->next; prev->next=p->next; free(p); } Copyright © 2008 - The Mc. Graw - Hill Companies, srl }

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Liste di

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!=EMPTYGRAPH) prev=prev->next; if (prev->next!=EMPTYGRAPH) { p=prev->next; prev->next=p->next; free(p); } } 27 } Copyright © 2008 - The Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati 2/ed void Add. Vertex. Graph(graph G, vertex v) { node_vertex

Algoritmi e strutture dati 2/ed void Add. Vertex. Graph(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 Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Liste di

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Liste di Adiacenza void Remove. Vertex. Graph(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!=EMPTYGRAPH) prev=prev->next; if (prev->next->v==v) { p=prev->next; prev->next=p->next; } } free(p); } } Copyright © 2008 - The Mc. Graw - Hill Companies, srl

Algoritmi e strutture dati 2/ed Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Riepilogo •

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 Mc. Graw - Hill Companies, srl