Esplora E-book
Categorie
Esplora Audiolibri
Categorie
Esplora Riviste
Categorie
Esplora Documenti
Categorie
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.
template <class Elem> int conta(BinNode<Elem>* subroot, int somma, int k, int livello) {
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)
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]