Grafi Rappresentazione mediante liste di adiacenza:

Slides:



Advertisements
Presentazioni simili
Puntatori Linguaggio C.
Advertisements

Depth-first search Visita in profondità di un grafo Algoritmo Esempio
Master Bioinformatica 2002: Grafi Problema: cammini minimi da tutti i vertici a tutti i vertici Dato un grafo pesato G =(V,E,w), trovare un cammino minimo.
Uso avanzato di C.
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture dati dinamiche.
Grafi Algoritmi e Strutture Dati. Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Algoritmi e strutture dati 2/ed 2 Copyright © The McGraw.
Algoritmi Avanzati Grafi e Alberi
Cammini minimi con una sorgente
Breath-first search Visita in ampiezza di un grafo Algoritmo Esempio
Depth-first search Visita in profondità di un grafo Algoritmo Esempio
Alberi binari di ricerca
Breath-first search Visita in ampiezza di un grafo Algoritmo Esempio
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Strutture dati per.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Esercizi su alberi binari
Tail recursion: esempio
Alberi binari Definizione della struttura dati: struct tree { };
Esercizi su alberi binari di ricerca
Esercizi su strutture dinamiche Fondamenti di Programmazione Canale AD a.a. 2009/2010.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di Programmazione a.a.2009/2010 Prof.ssa Chiara Petrioli Corso.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Corso di Programmazione 1 a.a.2007/2008 Prof.ssa Chiara Petrioli Corso di Laurea.
Algoritmi e Strutture Dati
Visite di grafi Algoritmi e Strutture Dati. Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Un albero è un grafo.
Laboratorio di Linguaggi lezione VI: puntatori 2/3 Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.
Laboratorio di Linguaggi lezione V Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in.
Algoritmi e Strutture Dati (Mod. B)
Grafi.
tipo astratto, implementazione, algoritmi
Albero: insieme di punti chiamati NODI e linee chiamate EDGES
Algoritmi e Strutture Dati
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
Esercizi su pile Scrivere una funzione che restituisca una nuova pila che contiene i valori di una pila in ingresso in ordine inverso. La pila originale.
Esercizi su code Date due code in ingresso a valori interi in ordine crescente, scrivere una funzione che restituisca una terza coda che contenga i valori.
Esercizi su alberi binari
Le liste dinamiche La ricorsione
Fondamenti di Informatica
Sorting: MERGESORT Vogliamo ordinare lista (a 1,…,a n ). 1.Dividi lista in 2 sottoliste aventi (quasi) la stessa dimensione: (a 1,a 3,a 5,…) e (a 2,a 4,…),
1.Scrivere una funzione per cercare un numero x in una lista circolare di interi. La funzione deve restituire NULL se il numero non esiste. 2.Scrivere.
1 ListaDiElem Cancella( ListaDiElem lista, TipoElemento elem ) { ListaDiElem puntTemp; if( ! ListaVuota(lista) ) if( lista–>info == elem ) { puntTemp =
15 maggio 2002 Avvisi: Ultima lezione: mercoledì 29 maggio II Esonero: mercoledì 5 giugno, ora da stabilire.
Corso di informatica Athena – Periti Informatici
Grafi.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 K 4 è planare? Sì!
C. Gaibisso Programmazione di Calcolatori Lezione XXII La struttura di dati lista di variabili strutturate Programmazione di Calcolatori: le liste di.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Corso di Programmazione 1 a.a.2007/2008 Prof.ssa Chiara Petrioli Corso di Laurea.
Esercizi Liste.
Esercizi su File e Liste
Tail recursion: esempio
Esercizi La distanza di hamming tra due interi x e y si definisce come il numero di posizioni nella rappresentazione binaria di x e y aventi bit differenti.
Esercizi su alberi binari di ricerca
Alberi binari Definizione della struttura dati: struct tree { };
Corso di Informatica 2 a.a. 2003/04 Lezione 6
Ordinamento topologico Cammino minimo dalla sorgente
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 5 Le strutture informative Corso di Informatica 2 a.a. 2003/04 Lezione 5.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Strutture dati per.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
MODULO STRUTTURE DATI FONDAMENTALI: Strutture dinamiche
Olimpiadi di Informatica 2010 Giornate preparatorie
Algoritmi elementari su grafi
Capitolo 11 Visite di grafi Algoritmi e Strutture Dati.
Master Bioinformatica 2002: Visite di Grafi Algoritmi di visita Scopo: visitare tutti i vertici di un grafo per scoprirne proprietà di vario tipo. Alcune.
Grafi: rappresentazione e visita
Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C Esercizi su Alberi.
Capitolo 11 Grafi e visite di grafi Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
13. Strutture dati dinamiche Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
1 MODULO STRUTTURE DATI FONDAMENTALI: Strutture dinamiche classe 4° INDUSTRIALE INFORMATICA Focus on.
Transcript della presentazione:

Grafi Rappresentazione mediante liste di adiacenza: struct graph_l { /* array di puntatori a liste */ list **adj_list; /* numero di vertici */ int n; }; Rappresentazione mediante matrici di adiacenza: struct graph_m /* matrice da allocare dinamicamente */ int **adj_matrix;

Creazione grafo con matrice di adiacenza graph_m *crea_grafo_m(int n)‏ { int i, j; graph_m *g = (graph_m *)malloc(sizeof(graph_m)); g->n = n; g->adj_matrix = (int **)malloc(sizeof(int*)*n); for(y=0; y < n; y++)‏ g->adj_matrix[y] = (int *)malloc(sizeof(int)*n); for(x=0; x < n; x++) g->adj_matrix[y][x] = 0; } return g;

Creazione grafo con liste di adiacenza graph_l *crea_grafo_l(int n)‏ { int i; graph_l *g = (graph_l *)malloc(sizeof(graph_l)); g->n = n; g->adj_list = (list **)malloc(sizeof(list *)*n); for(y=0; y < n; y++) g->adj_list[y] = NULL; return g; }

Visita in profondità (Depth-First Search)‏ Utilizziamo un array v per memorizzare i nodi già visitati void DFS(graph *g, int k)‏ { list *edges = g->adj_list[k]; v[k] = 1; printf(“%d,”, k); while(edges != null)‏ int j = edges->el; /* visita un nodo solo se non è stato ancora visitato */ if (v[j] == 0) DFS(g, j); edges = edges->next; }

Visita in ampiezza (Breadth-First Search)‏ Utilizziamo una coda per implementare una visita “a buccia di cipolla”: void BFS(graph *g, int k)‏ { coda *t = crea_coda(); tail_add(t, k); v[k] = 1; printf(“%d”, k); while(!coda_vuota(t))‏ int j = tail_remove(t); list *edges = g->adj_list[j]; while(edges != NULL)‏ j = edges->el; If (v[j] == 0)‏ printf(“%d,”, j); v[j] = 1; tail_add(t, m); } edges = edges->next;

Esercizi Scrivere una funzione che, dato un grafo rappresentato sotto forma di liste di adiacenza, ne restituisca la rappresentazione sotto forma di matrice di adiacenza Scrivere una funziona ricorsiva che, dato un grafo rappresentato mediante liste di adiacenza e dato un camino rappresentato mediante una lista di nodi, verifichi se il cammino esiste nel grafo fornito in input. Scrivere una funzione che dato un grafo e un nodo k di partenza determini per ciascun nodo destinazione j un cammino di lunghezza minima da k a j e la distanza di tale cammino Suggerimento: modificare la BFS in modo da memorizzare il nodo di provenienza e la distanza

Esercizio 1 Pre condizioni: Post condizioni: Scrivere una funzione che, dato un grafo rappresentato sotto forma di liste di adiacenza, ne restituisca la rappresentazione sotto forma di matrice di adiacenza. Pre condizioni: La funzione prende in ingresso un grafo rappresentato mediante liste di adiacenza Post condizioni: La funzione restituisce un grafo equivalente rappresentato mediante matrici di adiacenza.

Esercizio 1 graph_m *list2matrix(graph_l *g1)‏ { int y; list *l; graph_m *g2 = crea_grafo_m(g1->n); for(y=0; y<g1->n; y++)‏ for(l= g1->m[y]; l != NULL; l=l->next)‏ g2->m[y][l->el] = 1; return g2; }

Esercizio 2 Pre condizioni: Post condizioni: Scrivere una funzione ricorsiva che, dato un grafo rappresentato mediante liste di adiacenza e un cammino rappresentato mediante una lista di nodi, verifichi se il cammino esiste nel grafo fornito in input. Pre condizioni: La funzione prende in ingresso un grafo e una lista di nodi (ovvero un cammino)‏ Post condizioni: La funzione restituisce 1 se e' possibile percorrere il cammino nel grafo in input, 0 altrimenti.

Implementazione int verifica_arco(graph_l *g, int u, int v)‏ { list *adj = g->adj_list[u]; while(adj)‏ if (adj->el == v) return 1; adj = adj->next; } return 0; int verifica(graph *g_l, list *p)‏ if (!p || p->next == NULL) return 1; return verifica_arco(g, p->el, p->next->el) && verifica(g, p->next);

Esercizio 3 Pre condizioni: Post condizioni: Scrivere una funzione che dato un grafo e un nodo k di partenza determini per ciascun nodo destinazione j un cammino di lunghezza minima da k a j e la distanza di tale cammino. Pre condizioni: La funzione prende in ingresso un grafo, un nodo iniziale e gli indirizzi dei vettori distanza e cammino Post condizioni: La funzione imposta per ciascun nodo j nei due vettori rispettivamente la distanza minima partendo da k e il predecessore di j nel cammino minimo che parte da k

Svolgimento void dist_min(graph_l *g, int p, int **dist, int **predec)‏ { int i; *dist = (int *)malloc(sizeof(int), g->n); *predec = (int *)malloc(sizeof(int), g->n); /* predecessore del cammino min. di ciascun nodo */ for (i=0; I < g->n; i++) dist[i] = -1; /* -1 =>non visitato, altrimenti la distanza */ coda *c = crea_coda(); add_tail(c, p); dist[p] = 0; while(!coda_vuota(c))‏ int curr = remove_head(c); for(l=g->m[curr]; l != NULL; l=l->next)‏ if(dist[l->el] == -1) /* nodo non ancora visitato */ dist[l->el] = dist[curr] + 1; predec[l->el] = curr; add_tail(c, l->el); }