Cod sursa(job #2575092)

Utilizator danbesuDan Besu danbesu Data 6 martie 2020 11:36:40
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>

using namespace std;

ifstream in("cerere.in");
ofstream out("cerere.out");

const int nmax = 100001;
int n;
bool este_fiu[nmax], viz[nmax];
vector<int>k;

vector<int>graf[nmax];
vector<int>lista;
int rezz[nmax];

void umplere(int nod){

    lista.push_back(nod);

    viz[nod] = true;
    if(graf[nod].size() == 0)
       return;

    for(int i = 0; i < graf[nod].size(); ++i){
        int vecin = graf[nod][i];
        if(viz[vecin] == 0){
            if(k[vecin] == 0)
                rezz[vecin] = 0;
            else{
                int al_k_lea = lista[ lista.size() - k[vecin] ];
                rezz[vecin] = rezz[ al_k_lea ] + 1;
            }

            umplere(vecin);
            lista.pop_back();
        }

    }
}


int main(){

    in>>n;
    int a = 0; k.push_back(a);
    for(int i = 1; i <= n; ++i){
        in>>a; k.push_back(a);
    }
    for(int i = 1; i < n; ++i){
        int b; in>>a>>b;
        este_fiu[b] = true;
        graf[a].push_back(b);
    }

    int rad;
    for(int i = 1; i <= n; ++i){
        if(este_fiu[i] == false){
            rad = i;
            break;
        }
    }

    umplere(rad);

    for(int i = 1; i <= n; ++i)
        out<<rezz[i]<<' ';

    in.close();
    out.close();
    return 0;
}