Solutia problemei Defrisare
Subtaskul 1
Cum putem să folosim metoda pentru a fixa direcţia în care va cădea fiecare copac.
Subtaskul 2
Arborele are forma unui vector.
Putem să ne folosim de programarea dinamică pentru a calcula numarul optim de operaţii necesare pentru fiecare nod dacă acesta este orientat spre stânga sau spre dreapta.
numarul minim de operatii necesare pentru ca toti copacii aflati in stanga nodului sa pice dacă acesta cade spre stânga.
numarul minim de operatii necesare pentru ca toti copacii aflati in stanga nodului sa pice dacă acesta cade spre dreapta.
Iniţial presupunând ca niciun copac nu are înălţimea mai mare ca .
Dacă înseamnă că pot să tai copacul astfel încât să pice pe copacul curent, caz în care updatez
Dacă înseamnă că pot să tai copacul curent astfel încât să pice pe copacul , caz în care updatez
Subtaskul 3
Pentru acest subtask există cazuri:
Există două noduri şi legate de radacină prin muchii de lungimi , respectiv astfel încât şi . Răspunsul este .
Există un nod legat de radacină printr-o muchie de lungime astfel încât sau . Răspunsul este .
Nu există nicio muchie a cărei lungimi este mai mică decât înălţimea unuia dintre copacii pe care îi leagă. Răspunsul este .
Subtaskul 4
Pentru a rezolva acest subtask vom folosi o abordare similară cu cea de la subtaskul .
Definim:
numărul minim de operaţii necesare pentru a rezolva subarborele nodului dacă acesta cade spre unul dintre fii şi nu este doborât de alt fiu.
poate să nu atingă niciun alt copac.
numărul minim de operaţii necesare pentru a rezolva subarborele nodului dacă acesta cade spre unul dintre fii şi este doborât de alt fiu
numărul minim de operaţii necesare pentru a rezolva subarborele nodului dacă acesta cade spre radacină.
poate să nu fie atins de niciun alt copac.
Rădăcina poate să fie orice nod cu grad mai mic sau egal cu .
Să presupunem că ne aflăm în nodul cu fii şi de care se leagă prin muchiile de lungime respectiv .
Iniţializăm cu caz în care tai copacul curent fără să afecteze/ să fie afectat de subarborii lui şi .
Dacă poate să doboare copacul atunci updatez . Analog pentru .
Dacă poate să doboare copacul curent atunci updatez . Analog pentru .
Dacă poate sa doboare copacul curent şi poate să doboare copacul atunci updatez . Deoarece unesc două lanţuri numarul de operaţii necesare se micşorează cu 1. Analog pentru cazul .
Subtaskul 5
Soluţia se bazeaza pe acelaşi ca la subtaskul 4.
Pentru fiecare nod o să avem nevoie de o variabilă în care reţinem .
şi se calculează similar.
Pentru a calcula încercăm să cuplăm nodul curent cu fiecare fiu pe rând considerând că este doborât de copacul curent.
Avem însă nevoie să ştim ce fiu e optim să considerăm că doboară copacul .
Să presupunem că exista doi fii şi care pot să cadă spre nodul actual. Considerăm că este mai bun ca dacă . Astfel avem nevoie doar de primele două cele mai bune noduri care pot fi determinate printr-o singură parcurgere a fiilor nodului actual.