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 << " "; }