Atenţie! Aceasta este o versiune veche a paginii, scrisă la 2008-01-10 15:52:53.
Revizia anterioară   Revizia următoare  

Heavy path decomposition

(Categoria Algoritmi, autor Marius Stroe)

Acest articol prezinta un studiu al unei probleme ce urmareste determinarea eficienta a unei valori de extrem aflata pe lantul elementar dintre doua noduri date dintr-un arbore. Mentionez ca lant va insemna intotdeauna lant elementar in acest articol.

Enunt

In continuare voi prezenta enuntul unui tip de problema ce a aparut in fiecare an la concursurile de informatica. Motivul pentru care am ales acest lucru este ca multi ar fi tentati, prin diverse metode si astfel cu mult timp pierdut, sa incerce sa adapteze rezolvarea acesteia la rezolvarea problemei ce necesita heavy path decomposition. Iata enuntul:

Fie G = (V, E) un graf neorientat conex, |E| = |V| - 1. Astfel, intre oricare doua noduri x, y �µ V exista un singur lant ce le uneste. Vom considera ca fiecare nod x �µ V are asociata o valoare value[x] din multimea numerelor reale. Sa consideram urmatorul enunt.

Se dau M instructiuni, M <= 100000, de doua tipuri : primul tip cere sa se afiseze suma valorilor tuturor nodurilor ce se afla pe lantul dintre x, y �µ V (practic, daca �� = (x0, x1, x2, ..., xn), x0 = x si xn = y, este lantul elementar ce uneste cele doua noduri, atunci se cere S = â�� value[u], u �µ ��), iar al doilea tip modifica valoarea atasata unui nod.

Solutia se foloseste de o tehnica utilizata destul de frecvent in concursurile de informatica : liniarizarea arborelui. Aceasta presupune o parcurgere in adancime si retinerea unor informatii necesare pentru interogare si actualizare: seq[], firstPos[], lastPos[]. Iata pseudocodul acestei parcurgeri :

seq_len += 1;
seq[seq_len] = value[x];
firstPos[x] = seq_len;
pentru fiecare fiu y al lui x:
    apeleaza recursiv pentru y;
seq_len += 1;
seq[seq_len] = - value[x];
lastPos[x] = seq_len;