I grafi sono un potente strumento per la rappresentazione di problemi complessi.
La soluzione di moltissimi problemi può essere ricondotta alla soluzione di opportuni problemi su grafi.
Nel contesto dei grafi saranno approfonditi i seguenti argomenti:
Un grafo è una coppia (V, E), dove:
Un grafo (V,E) è non orientato se l’insieme degli archi E è un insieme di coppie non ordinate
Un grafo (V,E) è orientato se l’insieme degli archi E è una relazione binaria tra vertici.
In un grafo orientato, (w,v) si dice incidente da w a v, e v adiacente a w.
In un grafo non orientato, incidenze e adiacenze sono simmetriche.
In un grafo non orientato il grado di un vertice è il numero di archi che da esso si dipartono. Per es., A ha grado 2, mentre F ha grado 0.
In un grafo orientato il grado entrante (uscente) di un vertice è il numero di archi incidenti in (da) esso. Per esempio A ha grado uscente 2 e grado entrante 1.
Per rappresentare un grafo si può utilizzare:
Supponiamo di avere un Grafo G di n nodi 0,1,…,n e di volerlo rappresentare con una matrice di adiacenza. Si definisce allora una matrice M[n,n] riempita utilizzando la seguente regola
Per esempio, il seguente grafo costituito da 6 nodi è rappresentato dalla seguente matrice M[6,6]
Dovendo rappresentare un grafo G con n nodi ordinati con una lista di adiacenza, si definiscono n liste (una per ogni vertice) riempite nel modo seguente. Per ogni nodo v del grafo, L(v)=lista di w, tale che (v,w) ∈E
Per esempio, il seguente grafo di 6 nodi è rappresentato nel modo indicato.
Matrice di adiacenza
Liste di adiacenza
Di seguito elenchiamo alcune delle operazioni più comuni di interrogazioni su un grafo G:
Di seguito elenchiamo alcune delle operazioni più comuni di interrogazioni su un grafo G:
Di seguito elenchiamo alcune delle operazioni più comuni sulla modifica di un grafo G:
Sia G un grafo non orientato di n elementi 0,1,…,n-1 senza archi, da rappresentare con liste di adiacenza. La seguente funzione crea e restituisce un puntatore ad una struttura dati grafo con n liste di adiacenza vuote. Si noti come la presenza di ogni nodo i è implicita nella allocazione di memoria per la lista (vuota) dei nodi adiacenti ad i.
La seguente funzione controlla se un grafo è vuoto:
int is_empty(graph *G) { return (G==NULL); }
La seguente funzione serve a stampare un grafo G non orientato. Si ricordi che il grafo ha n nodi ordinati 0,1,…n-1
Mostriamo una funzione che inserisce l’arco (u,v) in un grafo G.
Precondizioni (da controllare in fase di implementazione!!!):
Si può anche aggiungere il nodo in testa. Si deve comunque scorrere tutta la lista per controllare se il nodo è già presente.
Di seguito mostriamo una funzione per la rimozione di un arco.
Prerequisiti: G non NULL; u e v vertici del grafo (compresi tra 0 e G->nv-1); l’arco (u,v) esiste.
La struttura di un grafo può essere generalizzata associando un valore numerico, detto peso, ai suoi archi. Un grafo di tale genere si dice pesato. I grafi pesati vengono rappresentati mediante
1. Introduzione al Corso - Il Linguaggio C (I parte)
2. Linguaggio C – Seconda Parte
3. Ordinamento, Ricorsione e Code di Priorità
4. Esercitazione su Ricorsione e Code di Priorità
5. Stack e Code
6. Esercitazione di Laboratorio su Stack e Code
7. Implementazioni di Liste puntate
8. Esercitazione di laboratorio su Liste Puntate Semplici
9. Implementazioni di Liste Doppiamente Puntate e Circolari
10. Esercitazione di laboratorio su Liste Doppiamente puntate
12. Esercitazione di laboratorio su Alberi Binari di Ricerca
13. Alberi Binari di Ricerca. Cancellazione di un nodo
14. Esercizio di Laboratorio. Gioco su alberi
15. Grafi: Implementazione ed operazioni di base
16. Esercitazione di laboratorio: Implementazione operazioni di bas...
17. Grafi: Inserimento e Cancellazione di un nodo. Visite in ampiez...
18. Esercitazione di laboratorio: Problema del venditore Prima part...
19. Componenti fortemente connesse e alberi minimi di copertura
20. Esercitazione di laboratorio: Problema del venditore Seconda pa...