Pagini recente » Cod sursa (job #2111591) | Cod sursa (job #1525746) | Cod sursa (job #1737507) | Cod sursa (job #2544848) | Cod sursa (job #1446409)
#include <fstream>
#include <unordered_set>
#include <vector>
using namespace std;
void make_padure(const vector<vector<int> >& copii, const vector<int>& al_catelea,
vector<vector<int> >& padure, const int cur, vector<int>& in_spate){
if(al_catelea[cur] != 0){
const int stramos = in_spate[in_spate.size()-al_catelea[cur]];
padure[stramos].push_back(cur); }
in_spate.push_back(cur);
for(const auto next : copii[cur]){
make_padure(copii, al_catelea, padure, next, in_spate); }
in_spate.pop_back(); }
void mark_subarbore(const vector<vector<int> >& padure, vector<int>& rez,
const int adanc, const int cur){
rez[cur] = adanc;
for(const auto x : padure[cur]){
mark_subarbore(padure, rez, adanc+1, x); } }
void citeste_date(vector<vector<int> >& padure, vector<int>& radacini){
ifstream f("cerere.in");
int n;
f >> n;
padure.resize(n);
vector<int> al_catelea(n);
for(int i = 0; i < n; ++i){
f >> al_catelea[i];
if(al_catelea[i] == 0){
radacini.push_back(i); } }
vector<vector<int> > copii(n);
unordered_set<int> nevazut;
for(int i = 0; i < n; ++i){
nevazut.insert(i); }
for(int i = 1, t, c; i < n; ++i){
f >> t >> c;
--t, --c;
nevazut.erase(c);
copii[t].push_back(c); }
vector<int> in_spate;
make_padure(copii, al_catelea, padure, *begin(nevazut), in_spate); }
int main(){
vector<vector<int> > padure;
vector<int> radacini;
citeste_date(padure, radacini);
vector<int> rez(padure.size());
for(const auto x : radacini){
mark_subarbore(padure, rez, 0, x); }
ofstream g("cerere.out");
for(const auto x : rez){
g << x << ' '; }
return 0; }