Sei sulla pagina 1di 2

API IOL 18 gennaio 2020 – SOLUZIONI

ESERCIZIO 1 (7 punti)
Dato un albero generico i cui nodi contengono valori interi, si scriva una funzione C++ che
conti quanti nodi soddisfano la seguente proprietà: il valore contenuto nel nodo corrente è
maggiore del valore massimo dei suoi antenati.

SOLUZIONE (una possibile soluzione)

int contaMaggioriDiAntenati ( Node * t, int maxAntenato = 0){


if (t == NULL ) return 0;
int count = 0;
int max; // Massimo tra il nodo e i suoi antenati

// Controllo su nodo corrente


if (t-> info > maxAntenato ){ // il nodo è maggiore dei suoi antenati
count++;
max = t->valore;
}
else max = maxAntenato;

// Prosegui visita albero


for (Node* temp = t->leftmost_child();
temp != NULL;
temp = temp->right_sibling())
count += countAncestorsRulers (temp , max );

return count;

Esercizio 2 (2.5 punti)


Si consideri un grafo G=(V,E) non orientato. Si vuole risolvere il seguente problema: dati in
input il grafo ed un numero intero K si determini se ogni coppia di vertici del grafo è
collegabile con un cammino contenente al più K archi. Si descriva un algoritmo per risolvere
il problema e si riporti la complessità dell’algoritmo proposto, specificando la complessità
delle sue parti e quindi quella totale.

SOLUZIONE (traccia)
1) Si applica l’algoritmo di Floyd in modo da calcolare le distanze minime tra tutte le coppie
di vertici (complessità cubica)
2) Si verifica se tutte le distanze nella matrice ottenuta sono minori di K (complessità
quadratica)
La complessità è quella massima tra le due operazioni è Theta (N^3)

Esercizio 3 (3 punti)

Si calcoli la complessità del seguente frammento di codice:

sum = 0;
for (k = 1; k < log N; k = k*2)
for(i = 1; i < 2^N; i = i*2)
for(j = 1; j < i; j++)
sum = sum+j;

SOLUZIONE

For esterno: k cresce come 2^h, per cui il ciclo esterno che arriva fino a log N verrà ripetuto
loglogN volte.

I cicli interni sono dipendenti: quando i vale 1 il ciclo interno viene ripetuto 1 volta, quando i
vale 2 il ciclo interno viene ripetuto 2 volte, quando i vale 4 verrà ripetuto 4 volte, ecc.
i cresce come 2^i quindi si ha
Sommatoria per i che va da 0 a N di 2^i = Theta(2^N)

La complessità totale è Theta(2^N log log N)