Sei sulla pagina 1di 2

API IOL 9 settembre 2020 – SOLUZIONI

ESERCIZIO 1 (6 punti)
Dato un albero binario di n nodi contenenti valori interi (positivi e negativi) ad un intero
positivo k, si scriva una funzione C++ che conti quanti nodi soddisfano la seguente
proprietà: la somma dei valori che si trovano lungo il cammino che va dalla radice ai nodi
che si trovano neiprimi k livelli è maggiore o uguale a k.

SOLUZIONE (una possibile soluzione)

template <class Elem> int conta(BinNode<Elem>* subroot, int somma, int k, int livello) {

if (subroot == NULL || livello>k)

return 0; // non occorre contare nulla

somma = somma + subroot->value();

if (somma >= k && livello<=k) c=1 else c=0;

return c + conta(subroot->left(), somma, int k, livello+1)

+ conta(subroot->right(), somma, int k, livello+1);

Esercizio 2 (4 punti)
Si consideri un grafo non orientato rappresentato tramite una matrice di adiacenza ed uno
dei suoi archi (v1,v2). Si descriva un algoritmo (a parole o in pseudocodice) che determini
se sconnettendo l’arco (v1,v2), il grafo viene partizionato in due componenti sconnesse. Si
descrivano input, output, passi da eseguire.
Infine si indichi qual è la complessità dell’algoritmo proposto nei casi peggiore e migliore.

Nella valutazione si terrà conto della correttezza, completezza, appropriatezza del linguaggio
utilizzato.

SOLUZIONE
La funzione riceve in ingresso V1 e V2 e
1) Nella matrice di adiacenza che rappresenta il grafo rimuove l’arco (V1,V2); se non
esiste restituisce un messaggio di errore.
2) Partendo dal vertice V1 effettua una visita (in ampiezza o in profondità) per
verificare se si possa raggiungere il nodo V2; se si può raggiungere la funzione
restituisce “false”, altrimenti restituisce “true”.
Nel caso peggiore vi è un’unica componente connessa ed è necessario visitare tutto il grafo
che potrebbe essere molto denso. La complessità è Theta(V^2).
Nel caso migliore V1 è una componente sconnessa non collegata ad altri nodi e la
complessità può essere Theta(1).

Esercizio 3 (2 punti)

Dato un array contenente i seguenti valori si costruisca un min-heap applicando l’algoritmo


basato su siftdown:
538742916
Si riportino l’elenco degli scambi effettuati e l’array finale.

SOLUZIONE
Scambi: 7-1, 2-8, 3-1, 5-1
152348976

[se gli elementi sono già presenti nell’array non conviene inserire un elemento per volta, ma
conviene applicare l’algoritmo di siftdown che 1) opera sull’array stesso, 2) richiede molti
meno scambi ed è più efficiente]

Potrebbero piacerti anche