Cod sursa(job #2777820)

Utilizator Albert_GAlbert G Albert_G Data 24 septembrie 2021 22:51:45
Problema Cerere Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <fstream>
#include <vector>

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

const int N = 1e5+1;
std::vector<int> graph[N];
int k[N], g[N]; //k,g-din enunt
int ramura[N]; //vectorul cu ramura curenta - ramura[i] = nodul de pe nivelul i
bool fr[N]; //1-daca catre el vine o ramura; 0-daca catre el nu e nicio ramura; folosit pentru gasirea root-ului

void dfs(int i, int nivel){
    if(!k[i]){
        g[i]=0;
    }
    else{
        g[i] = 1 + g[ramura[nivel-k[i]]];
    }
    ramura[nivel] = i;

    for(auto nod : graph[i]){
        dfs(nod, nivel+1);
    }
}

int main()
{
    int n;
    in>>n;
    for(int i=1;i<=n;++i){
        in>>k[i];
    }
    for(int i=1;i<n;++i){
        int a,b;
        in>>a>>b;
        graph[a].push_back(b);
        fr[b] = 1;
    }
    int root;
    for(int i=1;i<=n;++i){
        if(!fr[i]){
            root = i;
            break;
        }
    }
    dfs(root,1);
    for(int i=1;i<=n;++i){
        out<<g[i]<<' ';
    }
    return 0;
}