fbpx

Problema #651 – SumSubMax – Rezolvari PBInfo

de Mihai-Alexandru

Cerința

Se dă vectorul de tați al unui arbore cu rădăcină cu n noduri. Fiecare nod al arborelui are asociată o valoare numerică întreagă. Determinați nodurile p din arbore pentru care suma valorilor asociate nodurilor din subarborele cu rădăcina în p este maximă.

Date de intrare

Fișierul de intrare sumsubmax.in conține pe prima linie numărul de noduri n. Pe a doua linie se află vectorul de tați al arborelui, valorile fiind separate prin spații. Pe linia a treia se află, în ordine, valorile asociate nodurilor din arbore, separate și ele prin spații.

Date de ieșire

Fișierul de ieșire sumsubmax.out va conține, în ordine crescătoare, nodurile p din arbore pentru care suma valorilor asociate nodurilor din subarborele cu rădăcina în p este maximă, separate printr-un spațiu.

Restricții și precizări

  • 1 ≤ n ≤ 100
  • în vectorul de tați rădăcina este marcată cu 0
  • valorile asociate nodurilor din arbore sunt numere întregi din intervalul [-1000,1000]

Exemplu

sumsubmax.in

8
4 3 0 3 2 1 2 1
-3 2 -7 4 0 3 3 1

sumsubmax.out

2 4 

Explicație

În subarborii cu rădăcina în 2 și 4 suma valorilor asociate nodurilor este 5 și este maximă.

#include <bits/stdc++.h>


using namespace std;

ifstream cin("sumsubmax.in");
ofstream cout("sumsubmax.out");

vector <int> G[101];
int n  , p , x , y , k , T[102] , P[101] , C[101] , d[101];

int dfs(int x)
{
    P[x] = 1;
    d[x] = C[x];
    for(auto i:G[x])
        if(!P[i])
        {
            d[x] += dfs(i);
        }
    return d[x];
}

int main()
{
    cin >> n;
    for(int i = 1 ; i <= n ; i++)
    {
        cin >> T[i];
        if(T[i] != 0)
            G[T[i]].push_back(i);
        if(T[i] == 0) p = i;
    }

    for(int i = 1 ; i <= n ; i++)
        cin >> C[i];

    d[p] = dfs(p);
    int maxi = -9999;
    for(int i = 1 ; i <= n ; i++)
        if(d[i] > maxi) maxi = d[i];

    for(int i = 1 ; i <= n ; i++)
        if(d[i] == maxi) cout << i << " ";
}
Comentarii

S-ar putea sa iti placa