Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
come traccia durante le lezioni. Non sono assolutamente da considerarsi sostitutivi del
materiale didattico.
La geometria delle posizioni. Descrizione del problema dei ponti: scegliere un qualsiasi punto di partenza (sulla terra o su unisola) e tornarvi, dopo aver attraversato cisacun
ponte una e una sola volta. Esiste una soluzione? Un aiuto intermedio: passaggio alla
rappresentazione su grafo. Osservare come il grafo coglie gli elementi cruciali del problema, ovvero quali e quanti collegamenti ci sono tra i vari luoghi, mentre elimina quelli
inessenziali (lunghezza e forma dei ponti, forma delle isole etc.)
Se non esiste soluzione, perche non esiste? Ovvero, come e` possibile certificare la non
esistenza di una soluzione? Banalmente: basta considerare le 5040 = 7! possibili permutazioni dei ponti. E se il numero di ponti aumenta? 8! =40320; 20! numero di 19 cifre;
100! numero di 158 cifre) Si pu`o fare di meglio?
Il problema di Konigsberg non ha soluzione perche la seguente condizione necessaria
non e` soddisfatta: condizione necessaria per lesistenza di una soluzione e` che su ciascun
vertice del corrispondente grafo incida un numero pari di spigoli (i.e. ponti). La soluzione
e` anche sufficiente?
Risponderemo pi`u avanti quando torneremo sul problema dei ponti di Konigsberg, presenteremo un semplice algoritmo per individuare una soluzione (quando esiste) e affronteremo un problema di ottimizzazione che in qualche modo lo generalizza: il Problema
del Postino Cinese [9]:
Definizione di grafo (non orientato, semplice): una coppia di insiemi G(V, E) dove V e`
linsieme di vertici e E linsieme degli spigoli, ovvero un insieme di coppie non ordinate
di vertici distinti (per indicare questo, spesso useremo la notazione E V2 ).
Definizione di multigrafo: una coppia di insiemi G(V, E) dove V e` linsieme di vertici e
E il multiinsieme degli spigoli, ovvero un multiinsieme di coppie non ordinate di vertici
distinti.
Definizione di grafo orientato (semplice): una coppia di insiemi D(N, A) dove N e` linsieme
dei nodi e A linsieme degli archi, ovvero un insieme di coppie ordinate di nodi distinti.
Nel seguito quando parliamo semplicemente di grafo, ci riferiamo a un grafo non orientato; per riferirci ai grafi orientati useremo appunto, esplicitamente, laggettivo orientato
Osservare come la definizione di un grafo non sia grafica. Osservare come un grafo
con vertici V = {a, b, c, d} e E = {ab, ac, ad, bc, bd, cd} pu`o essere disegnato in modi
profondamente diversi! La rappresentazione grafica introduce aleatoriet`a che invece non
sono presenti nella definizione come coppia di insiemi.
Gli estremi di uno spigolo e E sono i vertici u, v della coppia individuata dallo spigolo,
ovvero i vertici tali che e uv. Se tra due vertici di un grafo esiste uno spigolo essi sono
adiacenti. Uno spigolo e e` incidente in un vertice v se v e` un estremo di e. Due spigoli
sono incidenti se hanno un estremo in comune.
Sia G(V, E) un grafo e v V . Grado deg(v): il numero di vertici cui v e` adiacente. N(v):
linsieme dei vertici cui v e` adiacente. (v): linsieme degli spigoli incidenti su v.
Handshaking Lemma [8]: per un qualunque grafo G(V, E) vale: vV deg(v) = 2|E|.
Osservare come questo risultato banalmente si estende a multigrafi. Corollario: per un
qualunque grafo G(V, E), il numero di vertici di grado dispari e` pari.
Sia G(V, E) un grafo. Un vertice isolato di G e` un vertice di grado 0. Il numero di spigoli
|E| e` la dimensione di G. Il numero di vertici |V | e` lordine di G.
Sia G(V, E)
un grafo. Il grafo complemento di G e` il grafo H(W, F) tale che W = V
W
e F = 2 \ E, ovvero il grafo complemento prende gli stessi vertici di G, mentre una
coppia di vertici e` adiacente nel grafo complemento se e solo se non e` adiacente in G.
Normalmente, lo indichiamo semplicemente come G. Osservare come il complemento
del complemento di G e` proprio G.
Sia G(V,
E) un grafo. Un sottografo H G e` un grafo H(W, F) tale che W V e F
W
E 2 , ovvero W e` un sottoinsieme di V , mentre F e` un sottoinsieme di spigoli di E i
cui estremi sono in W .
3.1
Per contare il numero di vertici adiacenti a un certo vertice i dobbiamo scorrere tutta
la riga di i (o la colonna di i), quindi questa operazione ha complessit`a O(n).
Per contare il numero di spigoli del grafo dobbiamo scandire tutta la matrice, quindi
la complessit`a del conteggio del numero di spigoli e` O(n2 ).
Loccupazione di memoria di questa struttura dati e` O(n2 ).
Se abbiamo bisogno di memorizzare ulteriori informazioni, e.g. la lunghezza, la
capacit`a di uno spigolo, il generico elemento ai j della matrice non e` pi`u semplicemente un numero binario, ma un record composto di diversi campi: il primo campo,
a valore 0-1 ci dice se quello spigolo fa parte del grafo, i successivi campi riportano
appunto lunghezza, capacit`a etc.
Se vogliamo memorizzare con matrice di adiacenza un grafo orientato, lunica cosa
che cambia e` che la matrice non e` pi`u simmetrica, in quanto ovviamente pu`o capitare
che (i, j) E ma ( j, i)
/ E.
Si osservi come, per un grafo non orientato, potremmo utilizzare la simmetria della matrice, e il fatto che per un grafo semplice la diagonale superiore si compone di tutti
0, e memorizzare solo la parte triangolare superiore della matrice di adiacenza. Tuttavia il vantaggio di questa rappresentazione compatta sarebbe trascurabile, perche e.g.
loccupazione di memoria e` sempre O(n2 ) (la diagonale superiore di una matrice n n ha
n(n1)
elementi).
2
Il vantaggio principale della matrice di adiacenza e` quello di poter verificare in tempo
costante se un certo spigolo appartiene al grafo. Il suo svantaggio principale e` quello di
essere una struttura statica che non e` influenzata in alcun modo dal numero di spigoli
presenti nel grafo: per esempio, il grafo completo con n vertici e il grafo vuoto con
n vertici occupano la stessa quantit`a di memoria! Questo svantaggio e` superato dalla
prossima rappresentazione basata su liste, che vediamo a breve. Prima per`o introduciamo
un altro modello di rappresentazione su matrice che sar`a molto utile per formulazione di
problemi di flusso e altri problemi che studieremo pi`u avanti.
Matrice incidenza: matrice binaria n m A, dove n = |V (G)| e m = |E(G)|. Ogni colonna
e` associata univocamente a uno spigolo, e aih = 1 se e solo se i e` estremo dello spigolo eh
(quindi ogni colonna ha esattamente due valori diversi da zero). Osserviamo che:
Sapere se un esiste uno spigolo tra un vertice i e un vertice j dobbiamo scorrere tutte
le colonne di A, quindi loperazione ha complessit`a O(m).
Per contare il numero di vertici adiacenti a un certo vertice i dobbiamo scorrere tutta
la riga di i, quindi questa operazione ha complessit`a O(n).
Per contare il numero di spigoli del grafo dobbiamo solo contare tutte le colonne,
quindi la complessit`a del conteggio del numero di spigoli e` O(m).
Loccupazione di memoria di questa struttura dati e` O(n m).
Primo principio di induzione. Per dimostrare che una certa proposizione P(n) vale per un
qualunque numero naturale n posso procedere come segue. 1) Passo base: dimostro che
P(1) e` vera, ovvero che la proposizione e` vera per n = 1. 2) Passo induttivo: dimostro
che se P(n) e` vera, allora anche P(n + 1) e` vera. Illustrare il primo principio di induzione
con il passaparola e il domino.
Dimostriamo con il primo principio che la seguente proposizione P(n): la somma dei
` pari a n2 . Passo base: laffermazione e` vera per
primi n numeri dispari, n1
h=0 (2h + 1), e
n = 1. Passo induttivo: supponiamo che laffermazione sia vera per n, i.e. n1
h=0 (2h+1) =
2
n , e facciamo vedere che essa e` vera per n + 1; infatti:
n
n1
2h + 1 = ( 2h + 1) + 2n + 1 = n2 + 2n + 1 = (n + 1)2
h=0
h=0
.
Secondo principio di induzione (apparentemente pi`u forte del primo, ma in realt`a equivalente). 1) Passo base: dimostro che P(1) e` vera, ovvero che la proposizione e` vera per
n = 1. 2) Passo induttivo: dimostro che se P(i) e` vera per qualunque i n, allora anche
P(n + 1) e` vera.
Dimostrare con il secondo principio che ogni numero naturale pu`o essere espresso come
prodotto di numeri primi. Passo base: laffermazione e` vera per n = 1. Passo induttivo:
supponiamo che laffermazione sia vera per ogni numero minore o uguale a n, i.e. per
ogni 1 h n, i.e. vale h = a1 (h) a2 (h) . . . ak(h) (h), con a1 (h), a2 (h), . . . , ak(h) (h)
primi, e facciamo vedere che essa e` vera per n + 1. Se n + 1 e` primo, allora laffermazione
e` vera poiche n + 1 = (n + 1) 1; se n + 1 non e` primo, allora n + 1 pu`o essere fattorizzato
come il prodotto di numeri tra 2 e n, cio`e n + 1 = b1 b2 . Ognuno di questi due fattori
e` minore di n + 1, vale quindi lipotesi induttiva e allora possiamo sostituire a ciascun
fattore la sua scomposizione in numeri primi, quindi alla fine esprimiamo n + 1 come
prodotto di numeri primi.
Attenzione nelluso del principio di induzione! Dimostriamo che un qualunque insieme
di n cavalli e` formato da cavalli dello stesso colore (vedi [6]). Prendiamo un insieme
di n cavalli. Se n = 1, laffermazione e` banale. Supponiamo ora che laffermazione
valga per insiemi con n cavalli e consideriamo un qualunque insieme X di n + 1 cavalli,
che indichiamo come X = {1, 2, 3, . . . , n + 1}. Consideriamo i due sottoinsiemi con n
elementi X1 = {1, 2, 3, . . . , n} e X2 = {2, 3, . . . , n + 1}: per ipotesi induttiva, ciascuno di
questi due insiemi e` formato da cavalli dello stesso colore. Osserviamo anche che questi
due insiemi si intersecano, e quindi esiste un cavallo che appartiene sia a X1 che a X2 .
Concludiamo quindi che X e` formato da cavalli dello stesso colore. O no?
i=1
Lultima disequazione segue dal Corollario 2, mentre per lultima equazione ricordiamo
che V (G) = V (G v) {v}.
8
Poniamo attenzione al fatto che |E(G)| |V (G)| 1 e` una condizione solo necessaria
perche G sia connesso. Considerate un grafo con 10 vertici {a1 , a2 , . . . , a5 , b1 , b2 , . . . , b5 }
e tale che tutti i vertici ai siano a coppie adiacenti, tutti i vertici bi siano a coppie adiacenti
e tale che non vi siano altri adiacenze. Malgrado il grafo abbia 20 >> 9 spigoli, esso non
e` connesso.
Lemma 4 Sia G(V, E) un grafo aciclico e e E uno spigolo. Il grafo G e e` ancora
aciclico e il suo numero di componenti connesse e` pari al numero di componenti connesse
di G +1.
Infatti, siano u e v gli estremi dello spigolo e e siano G1 , G2 , . . . , Gk le componenti connesse di G. Supponiamo senza perdita di genaralit`a, che u, v Gk . E` immediato verificare
che G1 , G2 , . . . , Gk1 sono ancora componenti connesse di G e. Infine segue dal Lemma
1 che Gk e consta di due componenti connesse.
Teorema 5 Condizione necessaria perche un grafo sia aciclico e` che il numero degli
spigoli sia al pi`u pari al numero dei vertici -1, i.e. |E(G)| |V (G)| 1.
La dimostrazione e` per induzione sul numero degli spigoli. In particolare, utilizziamo il
secondo principio di induzione. Laffermazione e` banalmente verificata se |E(G)| = 1.
Supponiamo ora che un qualunque grafo aciclico con al pi`u m 1 spigoli abbia almeno
m + 1 vertici e dimostriamo che allora un (qualunque) grafo aciclico G con m + 1 spigoli
ha almeno m + 2 vertici. Consideriamo uno spigolo e E(G) e il grafo G e. Siano
G1 , G2 , . . . , Gk le componenti connesse di Ge, con k 2. Ogni componente connessa Gi
e` tale che |E(Gi )| m. Quindi, per ipotesi induttiva, per ciascuna componente connessa,
vale |E(Gi )| |V (Gi )| 1. Osserviamo anche che possiamo partizionare E(G) in k + 1
classi: e, E(G1 ), E(G2 ) . . . , E(Gk ). Segue:
k
i=1
.
Poniamo attenzione al fatto che |E(G)| |V (G)| 1 e` una condizione solo necessaria
perche G sia aciclico. Considerate un grafo con 10 vertici {a1 , a2 , . . . , a10 } e con spigoli
{a1 a2 , a2 a3 , a3 a1 }. Malgrado il grafo abbia 3 << 9 spigoli, esso non e` aciclico.
Un grafo aciclico e connesso e` detto albero. Segue dai Teorema 3 + Teorema 5 che un
albero con n vertici ha n 1 spigoli. Si osservi che un albero e` un grafo minimalmente
connesso, in quanto la rimozione di un qualsiasi spigolo pregiudica la connettivit`a e
massimalmente aciclico, in quanto laggiunta di un qualsiasi spigolo pregiudica la aciclicit`a. Si osservi, in particolare, che per ogni coppia di vertici di un albero, esiste un e
un solo cammino con estremi i due vertici.
Un grafo ad albero e` quindi un grafo che viene utilizzato in tutti quei casi, per esempio il
progetto di una rete irrigua, in cui lesigenza primaria e` quella della connessione, mentre
la robustezza non e` unistanza cruciale.
9
Lemma 6 Un qualunque albero T (V, E) con almeno due vertici ha almeno due vertici di
grado uno, che sono detti foglie.
Si osservi che T non ha vertici di grado zero poiche stiamo assumendo che T abbia
almeno due vertici (ed e` connesso). Partizioniamo quindi V in due classi: la classe
V1 dei vertici che hanno grado 1, e la classe V2 dei vertici che hanno grado > 1. Per
lhandshaking lemma, 2|E| = vV deg(v) = vV1 deg(v)+ vV2 deg(v) = |V1 |+ vV2 deg(v)
|V1 | + 2|V2 |. Poiche 2|E| = 2(|V | 1) = 2|V1 | + 2|V2 | 2 segue: 2|V1 | + 2|V2 | 2
|V1 | + 2|V2 |, quindi |V1 | 2.
Dato G(V, E) un circuito euleriano e` un circuito (i.e. un trial chiuso) che passa per ciascuno spigolo di G una e una sola volta. Per esempio, se visitiamo una mostra in cui le
opere sono disposte nei corridoi, un circuito euleriano ci permetterebbe di visitare tutta
la mostra senza passare pi`u volte per lo stesso corridoio. Quando un grafo ammette un
circuito euleriano?
Teorema 7 Sia G(V, E) un grafo connesso. Allora le 3 affermazioni seguenti sono equivalenti:
1. G ammette un circuito euleriano.
2. Ogni vertice di G ha grado pari.
3. Linsieme degli spigoli di G pu`o essere partizionato in cicli disgiunti sugli archi, i.e.
/
E(G) = E(C1 ) E(C2 ) . . . E(Cq ), dove ogni Ci e` un ciclo e E(Ci ) E(C j ) = 0,
se i 6= j.
(1) (2) Banale, lo abbiamo gi`a osservato per il problema dei ponti di Konigsberg.
(2) (3) Laffermazione e` banale se G ha tutti vertici di grado 0. Supponiamo quindi
che G abbia almeno un vertice v con grado > 0 e consideriamo la componente connessa
G0 di G che contiene v. G0 e` connessa, quindi se fosse anche aciclica sarebbe un albero. Ma in questo caso avrebbe due vertici di grado 1, cosa che possiamo escludere,
poiche per ipotesi ogni vertice di G ha grado pari. Quindi G0 , e quindi anche G, ha un
ciclo C0 : lo rimuoviamo e consideriamo il grafo G1 = G C0 , ovvero il grafo che ha
gli stessi vertici di G, ma insieme degli spigoli pari a E \ E(C0 ). Osserviamo che tutti i
vertici di questo grafo hanno ancora grado pari o nullo. Se G1 ha tutti vertici di grado
0, allora laffermazione e` dimostrata con E = E(C0 ). Altrimenti G1 ha degli spigoli e
quindi almeno una componente connessa: ragionando come prima possiamo dedurre che
in questa componente connessa esiste un ciclo C1 . Rimuoviamo C1 e consideriamo il
grafo G2 = G1 C1 . Se questo grafo ha tutti vertici di grado 0, allora laffermazione e`
dimostrata con E = E(C0 ) E(C1 ), altrimenti, poiche e` ancora vero che ogni vertice di
10
semplice vedere che il Teorema 7 continua a valere se in (3) sostituiamo la parola circuiti alla parola
cicli. Nel seguito ci riferiamo a questa riformulazione
11
dom che parte da un nodo v e evita di percorrere pi`u volte lo stesso arco e` destinato
a riportarci in v. Nostra convenzione: risolviamo le situazioni di parit`a a favore
del nodo primo in ordine alfabetico o numerico; la concatenazione la facciamo man
mano, i.e. concateniamo il nuovo circuito a quello corrente.
Algoritmo di Hierholzer (Input G connesso e con almeno due vertici)
1. Se G contiene un vertice di grado dispari, STOP: G non ha un circuito euleriano. Se G
non ha spigoli, STOP: caso banale.
2. Scegli un vertice v0 di G.
3. **Costruzione di un circuito a partire da v0 in G**. Scegli uno spigolo e1 = v0 v1 di G.
A partire da e1 , costruisci un circuito C0 = {e1 , . . . , ek } come segue: finche e` possibile,
scegli uno spigolo ei+1 di G tale che ei e ei+1 sono entrambi incidenti in vi e ei+1 6
{e1 , . . . , ei }.
4. Poni i = 0, G0 = G e Z0 = C0 .
5. Rimuovi gli spigoli di Zi dal grafo Gi e sia Gi+1 = Gi \ Ci . Se ogni vertice di Gi+1 e`
isolato, allora il circuito Ci e` un trail euleriano per Gi : STOP.
6. Scegli un vertice wi del circuito Ci incidente con qualche spigolo del grafo Gi+1 (wi
non e` un vertice isolato per Gi+1 ). Costruisci un circuito Zi+1 , con inizio (e termine) wi
nella componente connessa di wi in Gi+1 , seguendo il procedimento indicato al passo 3
(ma con v0 = wi e G = Gi+1 ).
7. Forma un circuito Ci+1 concatenando Ci e Zi+1 (entrambi i circuiti contengono il vertice
wi ).
8. Poni i = i + 1 e vai a 5.
E` facile verificare che utilizzando liste dadiacenza lalgoritmo di Hierholzer pu`o essere
implementato con complessit`a O(|E|).
Alberi [3]
Il seguente Lemma 8 mostra che, in modo alternativo, possiamo definire un albero come
un grafo connesso con n vertici e n 1 spigoli, oppure come un grafo aciclico con n
vertici e n 1 spigoli.
Lemma 8 Sia G un grafo con n vertici. Allora due qualunque delle seguenti affermazioni
implicano la terza:
1. G e` connesso.
2. G e` aciclico.
12
3. G ha n 1 spigoli.
(1) + (2) (3) segue dal Teorema 3 + Teorema 5.
(2) + (3) (1) supponiamo viceversa che G e` aciclico, con n-1 spigoli, ma non e`
connesso. Allora G e` fatto di componenti connesse G1 , G2 , . . . , Gk con k 2. Siano u e v
rispettivamente un vertice di G1 e un vertice di G2 ; naturalmente uv
/ E(G).
Si osservi che il grafo G + uv, ovvero il grafo ottenuto aggiungendo a G lo spigolo uv, e`
ancora aciclico: infatti, poiche G e` aciclico, un qualunque ciclo di G + uv e` necessariamente composto dallo spigolo uv e da un path con estremi u e v che gi`a doveva appartenere
a G, contraddicendo il fatto che in G u e v appartengano a diverse componenti connesse.
Quindi G + uv e` un grafo aciclico con n vertici e n spigoli, una contraddizione al Teorema
5.
(3) + (1) (2) supponiamo viceversa che G e` connesso, con n-1 spigoli, ma non e`
aciclico. Sia quindi C un ciclo di G e e uno spigolo del ciclo C. Si osservi che il grafo
G e e` ancora connesso: infatti a un qualsiasi path P di G con estremi x, y corrisponde
un walk P0 di G e con estremi x, y, ottenuto sostituendo, eventualmente, allo spigolo e il
path P (composto dagli archi di C e) . Quindi G e e` un grafo connesso con n vertici
e n 2 spigoli, una contraddizione al Teorema 3.
Sottolineiamo due punti salienti della dimostrazione del Lemma 8.
Se G e` un grafo, G1 e G2 sono due componenti connesse di G (n.b. G potrebbe avere
anche anche altre componenti connesse) e u e v sono rispettivamente un vertice di G1 e
un vertice di G2 , allora i cicli del grafo G + uv sono gli stessi di G. In altre parole, se
aggiungiamo uno spigolo tra 2 componenti connesse, non creiamo nuovi cicli.
Se G e` un grafo, C e` un ciclo di G e e e` uno spigolo di C, allora le componenti connesse
di G e sono le stesse componenti connesse di G. In altre parole, se rimuoviamo uno
spigolo di un ciclo, non creiamo nuove componenti connesse.
Un grafo aciclico e connesso e` dunque un albero. Un grafo solo aciclico e` formato da
pi`u componenti connesse, ognuna delle quali e` un albero. Un grafo aciclico e` quindi
anche detto foresta. Si osservi quindi che un grafo aciclico con n vertici e k componenti
connesse ha esattamente n k spigoli.
Spesso per riferirci a un grafo che e` un albero useremo la notazione T (V, E).
Illustriamo unulteriore definizione di albero, questa volta di tipo algoritmico. Consideriamo la seguente procedura, detta Growing Tree Procedure (144-145 [4]):
1. Partiamo dal grafo G con un solo vertice.
2. Ripetiamo un qualunque numero di volte i seguenti due passi:
2.1) sia G0 il grafo ottenuto aggiungendo a G un nuovo vertice adiacente a un solo
vertice di G;
2.2) sia G := G0 .
13
Lemma 9 Ogni grafo costruito dalla Growing Tree Procedure e` un albero e ogni albero
pu`o essere costruito dalla procedura Growing Tree Procedure.
La dimostrazione del Lemma 9 pu`o ottenersi per induzione sul numero dei vertici sfruttando le seguenti oservazioni:
Sia T (V, E) un albero. Consideriamo il grafo T 0 (V {v}, E {uv}), ottenuto aggiungendo a T un nuovo vertice v adiacente a esattamente un vertice u V . E` facile
vedere che T 0 e` anchesso un albero. Cominciamo infatti dal mostrare che T 0 e` connesso: due vertici (x, y), con x e y 6= v, sono connessi in T 0 cos` comerano connessi
in T ; inoltre v e` connesso a qualunque vertice z V , poiche v e` connesso a u e u
e` connesso a z. Mostriamo quindi che T 0 e` aciclico: un qualunque ciclo dovrebbe
includere il vertice v, che per`o ha grado 1, e quindi non pu`o appartenere ad alcun
ciclo. T 0 e` aciclico e connesso e quindi T 0 e` un albero.
Sia T (V, E) un albero con almeno due vertici e v V una foglia (v esiste, per via del
Lemma 6). Consideriamo il grafo T 0 (V {v}, E \ (v)), ottenuto rimuovendo da T
la foglia v. E` facile vedere che T 0 e` anchesso un albero. T 0 e` aciclico: infatti T 0
proviene da un grafo aciclico, cui rimuoviamo uno spigolo e un vertice. Inoltre T 0 e`
connesso: infatti, due qualunque vertici x, y, con x e y V (T 0 ), sono connessi in T
con un path P che non include v e/o uv, quindi P e` anche un path di T 0 .
8.1
Prufer
Code ([12])
14
0
1
0
0
1
0
0
1
0
0
1
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
0
0
1
0
1
0
0
1
0
0
0
0
0
0
1
0
0
0
0
1
0
0
0
0
0
0
0
1
0
0
Una evoluzione della lista degli spigoli ci permette di memorizzare un albero con soli
(n 1)dlog ne bit. Lidea, molto semplice, richiede innanzitutto di scegliere un vertice
dellalbero: nel seguito assumiamo sia il vertice 0. A questo punto, per ogni spigolo
i j dellalbero esiste un vertice, per esempio i, che e` pi`u vicino a 0 e un vertice j che
e` pi`u lontano: diciamo che i e` il padre di j. Losservazione fondamentale e` che ogni
vertice, tranne 0, ha esattamente un padre (e ogni spigolo connette un vertice al padre).
Memorizziamo quindi il nostro albero con la lista degli spigoli, ma usiamo la convenzione
di memorizzare in a[1] il vertice 1 e in b[1] il padre di 1, in a[2] il vertice 2 e in b[2] il
padre di 2 . . . in a[n 1] il vertice (n 1) e in b[n 1] il padre di (n 1). Banalmente,
segue che a = [1, 2, . . . , n 1] e possiamo quindi memorizzare il solo vettore dei padri b,
che va sotto il nome di father code. Il father dellalbero T e` :
b = [0 4 1 0 4 1 1].
Il father code e` quindi un vettore di dimensione n 1, in cui ogni elemento e` un intero
tra 0 e n 1. Osserviamo che, per n = 7 lalbero corrispondente al code [0, 1, 2, 3, 4, 5] e`
un path, lalbero corrisponde al code [0, 0, 0, 0, 0, 0] e` una stella mentre nessun albero corrisponde a [6, 5, 4, 3, 2, 1, 0]! Quindi, al solito, ad ogni albero T (V, E) possiamo associare
in modo univoco un father code (facile da verificare), ma non e` vero ad ogni vettore di
dimensione n 1, in cui ogni elemento sia un intero tra 0 e n 1, possiamo associare un
albero.
Una evoluzione del father code e` il Prufer code. Si noti che per il father code gli spigoli
sono implicitamente ordinati come segue: per primo consideriamo lo spigolo tra il vertice 1 e il padre del vertice 1. . . per ultimo consideriamo lo spigolo tra il vertice n 1 e il
padre del vertice n 1. In pratica, il codice di Prufer ordina gli spigoli in modo diverso.
Per comprendere questo ordinamento supponiamo di smontare il nostro albero secondo
la Growing Tree Procedure. La procedura definisce una sequenza di alberi T1 . . . Tn dove
T1 = T e Tn e` fatto da un unico vertice: ad ogni passo Th+1 si ottiene da Th rimuovendone
una foglia (quindi uno spigolo): in particolare, supponiamo di risolvere le situazioni di
parit`a (quando nellalbero corrente Th ci sono pi`u foglie) in favore della foglia con indice pi`u basso che per`o non sia il vertice 0. Per esempio, procedendo in questo modo,
rimuoveremmo i vertici di T in questordine: 2, 3, 5, 4, 6, 7, 1 fino a rimanere appunto
con lalbero T8 costituito dal solo vertice 0.
La procedura di rimozione dei vertici determina naturalmente anche un ordinamento degli
spigoli di T , che nel caso precedente e` : 24, 31, 54, 40, 61, 71,10. Consideriamo la lista
degli spigoli corrispondente a questo ordiamente, avendo laccortezza di mettere sempre
nel vettore a e nel vettore b i padri. Nel caso precedente:
a = [2 3 5 4 6 7 1]
b = [4 1 4 0 1 1 0].
Si osservi come necessariamente b[n 1] = 0, quindi e` inutile memorizzare b[n 1].
Come mostriamo nel seguito, e` anche inutile memorizzare il vettore a che pu`o essere in16
duttivamente ricostruito da b. Le osservazioni chiave sono due: la prima e` che in ogni albero un vertice e` foglia oppure padre. La seconda e` che, per 1 h n1, il (sotto)vettore
[b[h]b[h + 1] . . . b[n 1]] contiene tutti e soli i vertici che sono padri per lalbero Th .
Quindi, per costruzione, a[1] deve essere uguale al pi`u piccolo intero compreso tra 0 e
n 1 che non e` appartiene al vettore [b[1]b[2] . . . b[n]]. Induttivamente, poi, a[i] deve
essere uguale al pi`u piccolo intero compreso tra 0 e n 1 che non appartiene n`e al
(sotto)vettore [a[1]a[2] . . . a[h 1]] (foglie che abbiamo rimosso fino al passo h-esimo)
n`e al (sotto)vettore [b[h]b[h + 1] . . . b[n 1]] (vertici che sono padri per Th ).
Memorizziamo quindi solo il vettore b0 = [b[1]b[2] . . . b[n 2]] (come abbiamo osservato
prima, b[n 1] e` sempre 0): e` questo codice va sotto il nome di Prufer code. Il Prufer
code dellalbero T e` :
b0 = [4 1 4 0 1 1].
Il Prufer code e` quindi un vettore di dimensione n 2, in cui ogni elemento e` un intero
tra 0 e n 1 e, al solito, ad ogni albero T (V, E) possiamo associare in modo univoco
un Prufer code (facile da verificare). Questa volta e` possibile dimostrare il viceversa:
ad ogni vettore di dimensione n 2, in cui ogni elemento sia un intero tra 0 e n 1
possiamo associare in modo univoco un albero con insieme dei vertici {0, 1, . . . , n 2, n
1} (omettiamo i dettagli, peraltro semplici, di questa dimostrazione). Naturalmente questi
due fatti insieme implicano il Teorema di Cayley menzionato in precedenza.
Per concludere osserviamo due fatti molto interessanti. Quanto illustrato in precedenza
mostra che possiamo memorizzare un albero con n vertici con (n 2)dlog ne bit, e che
non e` possibile fare di meglio. Inoltre, utilizzando il codice di Prufer e` possibile generare
in modo random un albero con n vertici in modo tale che tutti gli alberi con n vertici compaiano con la stessa probabilit`a : questo sarebbe molto difficile da fare se non utilizassimo
il codice di Prufer!
References
[1] https://en.wikipedia.org/wiki/Seven Bridges of Konigsberg
[2] N.L. Biggs, E.K. Lloyd, R.J. Wilson. Graph Theory 1736-1936. Clarendon Press Oxford.
[3] D. Jungnickel. Graphs, Networks and Algorithms: Capitolo 1. Springer.
[4] L. Lovasz, J. Pelikan, K.Vesztergombi Discrete Mathematics. Springer.
[5] K.H.Rosen. Discrete Mathematics and its Applications. Mc Graw-Hill.
[6] http://en.wikipedia.org/wiki/Mathematical induction
[7] https://en.wikipedia.org/wiki/Equivalence relation
17
18