Teoria dei Grafi Un grafo è costituito da: Un insieme finito di punti, detti nodi o vertici Un insieme finito di linee, dette archi o spigoli che uniscono coppie di punti. Una relazione, detta relazione di incidenza, che ad ogni spigolo associa i vertici che esso unisce. Pertanto un grafo può essere rappresentato da un disegno costituito da punti (vertici) e da linee (spigoli) che li uniscono a due a due. Esempi di grafi esistenti ‘in natura’ Una carta stradale può essere presentata come un grafo i cui nodi sono le città e i cui archi sono le strade fra una città ed un’altra. Una molecola può essere rappresentata come un grafo i cui nodi sono gli atomi che la compongono e i cui spigoli sono i legami fra gli atomi stessi, determinati dalle valenze. Un circuito elettrico può essere rappresentato come un grafo in cui i nodi sono i componenti (generatori, resistenze, interruttori) e i cui archi sono i fili elettrici fra un componente e l’altro. Concetti di base Un vertice e uno spigolo da esso uscente si dicono incidenti. I due vertici incidenti ad uno spigolo si chiamano anche estremi dello spigolo. Un laccio è uno spigolo che unisce un vertice a se stesso. Due spigoli che uniscono la stessa coppia di vertici si dicono paralleli. Un grafo privo di lacci e di spigoli paralleli si dice semplice. Il grado di un vertice è il numero di spigoli uscenti da esso. Esempio s E F Lo spigolo s forma un laccio. A D t C B u G Gli spigoli t e u sono paralleli. I vertici A,B,C hanno grado 3, E,F,G hanno grado 2, mentre D ha grado 4. Il grafo non è semplice, ma se togliessimo gli spigoli s e u lo diventerebbe. Grado dei vertici In un grafo privo di lacci la somma dei gradi dei vertici è uguale al doppio del numero degli spigoli. Infatti uno spigolo aumenta di uno il grado dei due vertici che unisce . Quindi uno spigolo fa aumentare di 2 la somma dei gradi dei vertici. Ne segue che la somma dei gradi dei vertici è un multiplo di 2. Grafi isomorfi Due grafi sono isomorfi se differiscono solo per la rappresentazione, ma hanno la stessa struttura. In termini formali: Due grafi G e H sono isomorfi se esistono una corrispondenza biunivoca fra i vertici di G e quelli di H ed una corrispondenza biunivoca fra gli insiemi degli spigoli di G e quelli di H che conservano la relazione di incidenza, cioè: ad uno spigolo e ad un vertice incidenti di G corrispondono uno spigolo ed un vertice incidenti di H. Esempio I due grafi in figura sono isomorfi. (Idea: schiaccia la faccia superiore del cubo e allarga la faccia inferiore). Altri esempi Un’altra coppia di grafi isomorfi. Nel primo vi sono due spigoli che si intrecciano, nel secondo no. Per avere l’isomorfismo basta trasformare lo spigolo rosso del grafo di destra nello spigolo rosso di quello di sinistra. Altri esempi I due grafi hanno lo stesso numero di vertici (6) e lo stesso numero di spigoli (9), ma non sono isomorfi. Perché? Risposta: il primo grafo ha un solo vertice di grado 4 mentre il secondo ne ha 2 (tali vertici sono colorati in verde). Matrici di incidenza Numeriamo i vertici di un grafo con numeri da 1 a n, ove n è il numero totale dei vertici. Formiamo una matrice nxn mettendo al posto i,j il numero di spigoli che uniscono i vertici con i numeri i e j rispettivamente. La matrice che otteniamo è detta matrice di incidenza del grafo. Vi è una matrice di incidenza per ogni numerazione dei vertici del grafo. Esempio Di seguito sono rappresentati un grafo e la sua matrice di incidenza 1 2 3 4 0 1 1 2 1 1 2 0 0 0 0 0 1 0 1 0 La matrice è simmetrica ed ha 0 sulla diagonale. Come mai? Esempio Vediamo ora come cambia la matrice di incidenza se si cambia la numerazione dei vertici 3 2 4 1 0 0 2 1 0 0 1 2 1 0 0 1 1 0 1 0 Il cambio di numerazione è rappresentato dalla legge h(1)=3, h(2)=2, h(3)=4, h(4)=1. L’elemento di posto i,j nella vecchia matrice si trova ora al posto h(i),h(j). In generale: Due grafi G e H sono isomorfi se prese comunque due matrici di incidenza di G e di H esse sono ottenibili una dall’altra con una permutazione h degli indici come nell’esempio precedente. Questo criterio però, pur essendo corretto, non è efficiente: se i grafi hanno n vertici, per verificare se sono isomorfi dovremmo provare tutte le n! permutazioni degli n indici dei vertici. Cammini Un cammino in un grafo è una sequenza finita A1,s1,A2,s2,…,An,sn,An+1 in cui A1, A2,…,An+1, sono vertici, e s1 unisce A1 e A2, s2 unisce A2 e A3,…, sn unisce An e An+1 . Un grafo è connesso se ogni coppia di vertici è collegata da un cammino. Esempio F D A B E C In figura è rappresentato un grafo connesso. La linea rossa rappresenta un cammino dal nodo A al nodo B. Grafi non connessi B C E F G D A Nel grafo i vertici sono ripartiti in due classi, A,B,C (colorati in nero) e D,E,F,G (colorati in rosso). Vertici di classi diverse (uno rosso e uno nero) non sono uniti da nessuno spigolo. Tale partizione si chiama sconnessione. Un grafo che ammette una sconnessione non è connesso. Grafi connessi e grafi sconnessi Si può dimostrare che un grafo è connesso se non ha sconnessioni. Questo criterio non è però efficiente in quanto se il grafo ha n vertici le possibili partizioni dell’insieme dei vertici sono 2n. Vedremo in seguito un metodo più efficiente per determinare se un grafo è connesso. Algoritmo per riconoscere se un grafo è connesso Inizia una lista con un vertice V a caso. Aggiungi alla lista tutti i vertici uniti a V da uno spigolo. Ripeti ricorsivamente la procedura a partire da ciascuno dei nuovi vertici introdotti. Se ad un certo punto la lista contiene tutti i vertici del grafo, il grafo è connesso. Se ripetendo il procedimento non si ottengono nuovi elementi nella lista, ma la lista non contiene tutti i vertici, il grafo non è connesso. Esempio Sia G il grafo la cui matrice di incidenza è 1 0 1 0 0 2 0 1 1 0 0 1 2 0 0 1 Il vertice 1 è unito al vertice 3, il vertice 2 è unito al vertice 4, e i vertici 1,2,3,4 sono uniti a se stessi. Applicando l’algoritmo partendo da 1 aggiungo il vertice 3 alla lista, ma al passo successivo posso solo aggiungere i vertici 1 e 3 che già fanno parte della lista. Quindi il grafo non è connesso Esempio Sia G il grafo la cui matrice di incidenza è 1 0 1 0 0 0 2 1 2 1 1 0 0 1 0 1 Applicando l’algoritmo partendo da 1, aggiungiamo alla lista il vertice 3. 3 è unito a 2 da due spigoli, quindi aggiungiamo 2 alla lista. 2 è unito a 4 da uno spigolo, quindi aggiungiamo anche 4. Ora la lista contiene tutti i vertici, e il grafo è connesso. Ponti di Koenisberg Un classico problema di Teoria dei Grafi è il seguente: è possibile partendo da un punto qualsiasi della città di Koenisberg passare da tutti i ponti della città una volta ed una sola tornando al punto di partenza? Esempio: i ponti di Koenisberg D C B In figura, A e D rappresentano la riva destra e la riva sinistra del fiume Pregel, C e B rappresentano le due isole e gli archi rappresentano i ponti. A Esiste un percorso ciclico che passi con continuità da tutti gli spigoli una volta ed una sola? Eulero: La risposta è NO. Infatti: Se ci fosse un tale cammino, ogni volta che si arriva ad un vertice attraverso uno spigolo in entrata, dovrebbe esserci anche un altro spigolo in uscita, diverso da quello di entrata. Quindi il grado di ogni vertice dovrebbe essere in numero pari. Invece nel problema dei ponti di Koenisberg i vertici hanno tutti grado dispari (alcuni 3 e altri 5). Esempio: i ponti di Koenisberg D C B A Il vertice B ha grado 5, mentre gli altri vertici hanno grado 3. Prima o poi entro in un vertice con un ponte senza disporre di ponti non ancora utilizzati per uscirne. Grafi Euleriani Un circuito è un cammino in cui ogni spigolo compare al massimo una volta e in cui il punto di partenza e quello di arrivo coincidono. Un grafo si dice Euleriano se ammette un circuito che contiene tutti gli spigoli. Il grafo dei ponti di Koenisberg non è Euleriano. Teorema di Eulero Un grafo è Euleriano se e solo se ogni suo vertice ha grado pari. Osservazione. Un circuito Euleriano può passare più volte dallo stesso vertice, ma non dallo stesso spigolo. Esempio V Nel grafo disegnato in figura ogni vertice ha grado pari (2 o 4). Quindi il grafo è Euleriano. Un circuito Euleriano è qui rappresentato. Il fatto che il circuito passi due volte per V è irrilevante. Il problema del commesso viaggiatore Un commesso viaggiatore deve visitare vari clienti dislocati in diverse città. Alcune di queste città sono collegate in modo diretto da una strada. Ci chiediamo se il commesso viaggiatore può raggiungere tutti i clienti e tornare al punto di partenza senza passare due volte per la stessa città. Il problema del commesso viaggiatore Rappresentiamo le città con dei punti e le strade fra una città e l’altra come linee che uniscono i punti che le rappresentano. Otteniamo così un grafo. Il problema del commesso viaggiatore è quello di trovare un cammino che passi una volta ed una sola da tutti i vertici e torni al punto di partenza. Il problema del commesso viaggiatore v Nel grafo di sinistra vediamo rappresentato un percorso che passa da tutti i vertici una ed una sola volta. Il percorso non è Euleriano perché non passa da tutti gli spigoli. Nel grafo di destra un simile percorso non c’è (si è costretti a passare due volte per il vertice V). Al contrario, il grafo di destra è Euleriano. Grafi Hamiltoniani Un ciclo è un circuito che non passa mai due volte dallo stesso vertice (salvo quello di partenza che coincide con quello di arrivo). Un ciclo è Hamiltoniano se contiene tutti i vertici del grafo. Un grafo è Hamiltoniano se ammette un ciclo Hamiltoniano, cioè se ha un circuito che parte da un vertice e torna al punto di partenza passando una volta ed una sola per tutti i vertici del grafo. Grafi Hamiltoniani e grafi Euleriani Esiste un semplice criterio per stabilire se un grafo è Euleriano: le somme degli elementi delle linee della matrice di incidenza (che corrispondono ai gradi dei vertici) devono essere tutte numeri pari. Al contrario, non sono noti criteri per stabilire rapidamente se un grafo è Hamiltoniano o no. (Provare tutti i cammini possibili e controllare se sono Hamiltoniani o no ha complessità esponenziale) (nel caso peggiore vi sono n! cammini) Grafi ad albero Un grafo ad albero è un grafo connesso e privo di cicli. Si noti che un grafo ad albero è semplice, poiché un laccio o una coppia di spigoli paralleli formano un ciclo. Si può dimostrare che un grafo semplice e connesso è ad albero se e solo se il numero v dei vertici supera di uno il numero s degli spigoli, cioè v=s+1. Esempi Il grafo di sinistra è ad albero, quello di destra no. Conta il numero dei vertici e degli spigoli di entrambi. Cosa osservi? Esempi Nonostante le apparenze, il grafo di sinistra è ad albero, essendo isomorfo a quello di destra. Visita di un grafo Il problema generale è quello di accedere all’informazione contenuta nei vari nodi di un grafo utilizzando gli spigoli del grafo stesso per spostarci da un nodo all’altro. Ad esempio: Come posso visitare il sito dell’Università di Siena accedendo a tutte le informazioni in esso contenute? Vi sono due modi standard per visitare un grafo: la visita in profondità e la visita in larghezza. Visita in profondità L’idea è quella di procedere il più possibile lungo un ramo del grafo. Quando non è più possibile procedere, si torna indietro e si riparte da capo. Per semplicità supporremo che il grafo sia connesso. Durante il procedimento formiamo due liste: una lista A dei vertici ancora da visitare e una lista B dei vertici che sono già stati visitati, ma da cui si possono raggiungere vertici ancora da visitare. I vertici che non appartengono a nessuna delle due liste sono quelli già trattati, e quindi non ce ne dobbiamo più preoccupare. Visita in profondità All’inizio la lista A comprende tutti i vertici e la lista B è vuota. Il procedimento termina quando la lista A è vuota, cioè quando non ci sono più vertici da visitare. Visita in profondità 1. 2. 3. Sia V il primo vertice della lista A. Visita V. Aggiungi V alla lista B e toglilo dalla lista A. Fintanto che la lista A non è vuota, ripeti il seguente: Sia W il primo elemento della lista B. Se non esistono vertici V nella lista A uniti a W da uno spigolo, cancella W dalla lista B. Ripeti finché trovi un V nella lista A unito al primo elemento W della lista B da uno spigolo. Sia V il primo di questi Visita V, togli V dalla lista A ed aggiungilo all’inizio della lista B. Esempio Il precorso di visita in profondità di un grafo. 1 2 4 3 5 7 6 Visita in larghezza L’idea è quella di procedere con una ricerca ramificata. Invece di andare avanti finchè possibile in un’unica direzione, si fa un passo alla volta in tutte le direzioni. Anche in questo caso supporremo che il grafo sia connesso. Visita in larghezza Anche questa volta useremo due liste, la lista A dei vertici in lista di attesa, e la lista B dei vertici già visitati. Supporremo data anche una lista C di tutti i vertici. All’inizio le liste A e B sono entrambe vuote. Il procedimento termina quando la lista B comprende tutti i vertici. Visita in larghezza 1. 2. 3. Sia V il primo vertice di C. Poni V nella lista A. Fintanto che B è diverso da C ripeti il seguente procedimento: Sia V il primo vertice della lista A. Visita V e aggiungilo alla lista B. Togli V dalla lista A e aggiungi, in fondo alla lista A, tutti i nodi uniti a V da uno spigolo e che non sono né nella lista A né nella lista B. Esempio 1 2 3 4 7 5 6 Il percorso di visita dello stesso grafo in larghezza Spanning tree Gli spigoli utilizzati durante la visita di un grafo formano un albero che passa per tutti i vertici. Un albero con questa proprietà viene detto spanning tree 2 1 4 3 5 7 6 Spanning tree ottenuto con una visita in profondità Esempio Spanning tree dello stesso grafo ottenuto con una visita in larghezza 1 2 4 3 5 7 6 Grafi etichettati Consideriamo ora dei grafi in cui ogni spigolo ha un’etichetta numerica, che possiamo pensare come il costo necessario per percorrerlo. Ad esempio, in una carta stradale i vertici sono le città, gli spigoli sono le strade fra una città e l’altra, e le etichette delle strade sono le loro lunghezze in chilometri. Commesso viaggiatore, seconda versione Un commesso viaggiatore deve visitare vari clienti dislocati in varie città, unite fra loro da strade. Questo secondo commesso, più furbo del precedente, non si preoccupa di passare due volte dalla stessa città, ma piuttosto di visitare tutti i clienti e di tornare a casa percorrendo meno strada possibile. Commesso viaggiatore 2 La situazione questa volta è rappresentata con un grafo etichettato. I nodi sono le città, gli spigoli sono le strade fra una città e l’altra, e le etichette sono le lunghezze delle strade. Il problema è ora quello di trovare un cammino che, passando da tutti i vertici del grafo, torni al punto di partenza, e che renda minima la somma delle etichette degli spigoli del cammino stesso. Algoritmo greedy Greedy in inglese significa goloso. Un algoritmo greedy è un algoritmo che cerca di ottenere subito il massimo possibile, senza preoccuparsi di seguire strategie a lungo termine (meglio un uovo oggi che una gallina domani). Come vedremo, nel problema del commesso viaggiatore l’algoritmo greedy non sempre fornisce la soluzione migliore. Algoritmo greedy Parti da un nodo V. Ad ogni passo, parti dal nodo W a cui sei arrivato e scegli lo spigolo più corto (di etichetta minima) fra quelli che connettono W con un nodo U che non hai ancora visitato. Visita tale nodo U. Se ogni nodo unito a W da uno spigolo è già stato visitato, torna al nodo precedente. Algoritmo greedy Il seguente esempio mostra che l’algoritmo greedy non è sempre il migliore 2 A C 4 D 3 7 E 3 3 2 A 4 B C 4 D 3 7 E 3 3 4 B Il percorso suggerito dall’algoritmo greedy è ADECBA che ha lunghezza 2+3+7+3+4=19 Il percorso ABCDEA ha lunghezza 4+3+4+3+3=17 Commesso viaggiatore 2 Non è noto (e forse non esiste) nessun algoritmo rapido per trovare il minimo cammino che partendo da un vertice passa per tutti i nodi e torna al punto di partenza. L’algoritmo che consiste nel provare tutti i cammini richiede tempo n!, ove n è il numero dei vertici. Minimum spanning tree Ci proponiamo ora di visitare un grafo etichettato, in cui le etichette numeriche sugli spigoli denotano il costo per passare da un estremo all’altro. Anzicché effettuare una visita in profondità o in larghezza, cerchiamo la visita di costo minimo. L’albero costituito dagli spigoli utilizzati durante una tale visita è l’albero di costo minimo che passa per tutti i vertici. Esso è detto minimum spanning tree. Algoritmo greedy per il minimum spanning tree L’idea è quella di aggiungere di volta in volta lo spigolo meno costoso fra quelli che non sono superflui. Uno spigolo è superfluo se insieme agli altri già introdotti forma un ciclo. Algoritmo: Fintanto che esiste un nuovo spigolo non ancora introdotto che non crea un ciclo, ripeti la seguente procedura: Aggiungi lo spigolo di costo minimo fra quelli non ancora introdotti che non creano cicli. L’algoritmo termina appena aggiungendo un qualunque nuovo spigolo si crea un ciclo. Minimum spanning tree L’algoritmo produce il minimum spanning tree. Sia infatti M il minimum spanning tree, e sia T l’albero prodotto dall’algoritmo. Supponiamo per assurdo che siano diversi. Sia s il minimo spigolo di M che non è in T. Siano s1,…,sn gli spigoli di M di costo minore di s. Essi sono anche in T. Sia t lo spigolo di T introdotto subito dopo s1,…,sn . Si ha che t ha costo minore di s. Minimum spanning tree Essendo M connesso, gli estremi di t sono uniti da un cammino in M. Almeno uno spigolo u di tale cammino non è in T, altrimenti aggiungendo t a tale cammino avremmo un ciclo in T. Sia v un tale spigolo. Si vede subito che v ha costo maggiore di t. Rimpiazzando in M lo spigolo v con t otteniamo uno spanning tree di costo inferiore. Raggiungiamo così un assurdo. Esempio Vogliamo determinare il minimum spanning tree del grafo disegnato sotto B 2 A 1,5 C 7 G 3,5 4 K 6,5 6 D 2,5 3 5 H 4,5 5,5 F E Gli spigoli introdotti sono: BC, BA, AD, DE, FH, DF, DG, GK. Esempio Il minimum spanning tree del grafo è disegnato sotto in rosso 1,5 7 2 4 3,5 6,5 6 2,5 5 3 5,5 4,5 Esempio 1,2 E 3,5 1 A 2,5 4 B . F 1,6 1,5 D G 3,8 C 3 Un altro esempio di minimum spanning tree. L’ordine degli spigoli è: DE, EF, DG, AD, BC, CD. Colorazioni Un famoso problema matematico è quello di dimostrare che una qualsiasi carta geografica può essere colorata con quattro colori in modo che due qualunque stati confinanti abbiano colori diversi. (Problema dei quattro colori). Se rappresentiamo gli stati con dei nodi e i confini fra due stati come uno spigolo che unisce i nodi corrispondenti, il problema diventa quello di colorare i nodi di un grafo con quattro colori in modo che due nodi uniti da uno spigolo abbiano colori diversi. Problema generale Siano dati un grafo G ed un numero n. E’ possibile colorare G con n colori in modo che due qualunque vertici uniti da uno spigolo abbiano colori diversi? Se si può il grafo G viene detto n-colorabile. Per ogni n, esiste un grafo che non è n colorabile. Basta prendere n+1 vertici e unirli a due a due in tutti i modi possibili. Per colorarlo ho bisogno di n+1 colori. 2-colorabilità Un grafo è 2-colorabile se e solo se non ha cicli con un numero dispari di elementi. Algoritmo: coloro il primo vertice V di rosso; coloro i vertici raggiungibili da V con uno spigolo in blu. Coloro i vertici raggiungibili con uno spigolo da questi ultimi in rosso. Etc, etc…, a fasi alterne uso il rosso e il blu finché non ho colorato tutti i vertici. Esempi ? Una 2-colorazione del grafo di sinistra e un tentativo fallito di 2-colorazione del grafo di destra 3-colorabilità ? Un grafo 3-colorabile.. e un grafo non 3 - colorabile n-colorabilità Per n>2 non sono noti criteri rapidi per decidere se un grafo è n-colorabile. Un ovvio algoritmo consiste nel provare tutte le possibili n-colorazioni. Una n-colorazione può essere pensata come una funzione dall’insieme dei nodi all’insieme degli n colori. Se i nodi sono k le possibili colorazioni sono nk. Il procedimento esaustivo che consiste nel provare tutte le colorazioni è pertanto molto lento. Grafi orientati In un grafo orientato gli spigoli sono linee con un verso che va da un vertice all’altro. La funzione di incidenza associa ad ogni spigolo orientato una coppia ordinata di vertici, uno dei quali è il primo estremo, e l’altro il secondo estremo. Esempio 3 2 5 6 4 1 Un esempio di grafo orientato Esempi di grafi orientati I flow chart, che sono schemi di programma costituiti da istruzioni elementari e connessioni fra le stesse rappresentate da frecce che fanno passare da un’istruzione all’altra. Gli automi a stati finiti, che sono macchine per il riconoscimento di linguaggi, costituite da stati di accettazione e stati di rifiuto, e frecce da uno stato ad un altro etichettate con una lettera dell’alfabeto. Una freccia da p a q etichettata con la lettera a significa: se sei nello stato p e leggi la lettera a passa nello stato q e leggi la prossima lettera Come cambia la teoria se si passa ai grafi orientati? Matrice di incidenza: al posto i,j della matrice, metto il numero di spigoli orientati che vanno dal vertice i al vertice j. La matrice di incidenza non è necessariamente simmetrica, in quanto possono esserci spigoli orientati da i a j senza che vi siano spigoli orientati da j a i. Esempio Un grafo orientato .. 3 2 4 1 e la sua matrice di incidenza 0 1 0 0 0 0 1 0 1 0 0 0 0 1 1 0 Come si vede la matrice non è simmetrica Cammini in un grafo orientato In un grafo orientato i cammini devono procedere nella direzione delle frecce. Un grafo è connesso se per ogni coppia di suoi vertici A e B esistono sia un cammino da A a B che un cammino da B ad A. Si noti che è possibile che esista un cammino da A a B, ma non un cammino da B ad A. Grafi orientati connessi Una sconnessione di un grafo orientato è una suddivisione dei vertici del grafo in due insiemi disgiunti A e B tale che o non esistono frecce da A a B o non esistono frecce da B ad A. Si può dimostrare che un grafo orientato è connesso se e solo se non ha sconnessioni. Esempio Un cammino in un grafo orientato 3 2 5 6 4 1 Nota: mentre è possibile andare da 1 a 6 con un cammino, non vi sono cammini da 6 a 1. Quindi il grafo non è connesso. Esempio Un esempio di grafo orientato connesso 3 2 6 4 1 5 Altro esempio di grafo connesso • Consideriamo il grafo orientato la cui matrice di incidenza è 0 0 1 1 1 0 0 0 1 0 0 0 1 1 1 0 • Ci chiediamo se il grafo sia connesso o no. Altro esempio di grafo connesso 0 0 1 1 1 0 0 0 1 0 0 0 1 1 1 0 Dalla prima riga vedo che posso andare da 1 a 2 Dalla seconda riga vedo che posso andare da 2 a 3. Dalla terza vedo che posso andare da 3 a 4 Dall’ultima riga vedo che posso andare da 4 a 1 Alberi orientati Un albero orientato è un grafo orientato in cui: Se al posto degli spigoli orientati sostituiamo spigoli non orientati, otteniamo un grafo ad albero. Ad ogni vertice arriva al massimo una freccia. In un albero orientato, esiste uno ed un solo nodo a cui non arrivano frecce. Tale nodo è detto radice. Esistono poi nodi da cui non partono frecce. Tali nodi sono detti foglie. Un esempio di albero orientato Un albero orientato. I nodi colorati in verde sono le foglie, mentre il nodo marrone è la radice. Applicazioni Gli alberi orientati hanno molte applicazioni che non trattiamo per mancanza di tempo: Rappresentazione di termini o di formule di un linguaggio. Rappresentazione di dimostrazioni logiche. Alberi di sequenze finite. Basi di dati. Conclusioni Chi si aspettava una ricetta matematica per risolvere tutti i problemi di bioinformatica è sicuramente rimasto deluso. Tuttavia non era questo lo scopo del corso. La matematica non dà una ricetta per risolvere i nostri problemi, ma insegna ad affrontarli razionalmente. Chi ha assimilato bene i concetti esposti durante il corso dovrebbe essere in grado di applicare le tecniche usate ad esempio per il gioco del Lotto a svariate situazioni che si incontrano nella ricerca scientifica. Conclusioni Per concludere, in questo corso spero di avere mostrato un metodo, quello matematico, che può essere utilizzato con profitto in varie aree della ricerca scientifica, fra cui la bioinformatica. Augurandomi che possiate metterlo a frutto, con l’aiuto dei colleghi più esperti di me in biologia e in informatica, vi lascio con una citazione dantesca: … e sei venuto in parte dov’io più oltre non discerno …. Non aspettar mio dir più, né mio cenno.