Cod sursa(job #2558401)

Utilizator stefanpiturStefan Alexandru Pitur stefanpitur Data 26 februarie 2020 15:57:38
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <fstream>
#define UNVISITED -1
using namespace std;

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

const int N = 100000;

int pas[N+1], urm[N+1];
int d[N+1], in[N+1];
vector <int> g[N+1];
vector <int> stiva;

void dfs(int node){
    stiva.push_back(node);
    int poz = (int)stiva.size() - pas[node] - 1;
    urm[node] = stiva[poz];
    for(int p=0; p<(int)g[node].size(); p++){
        int next = g[node][p];
        dfs(next);
    }
    stiva.pop_back();
}

void solve(int node){
    int next = urm[node];
    if(d[next] == UNVISITED)
        solve(next);
    d[node] = d[next] + 1;
}

int main()
{
    int n,i,x,y,root;
    fin >> n;
    for(i=1; i<=n; i++){
        fin >> pas[i];
        if(pas[i] == 0)
            d[i] = 0;
        else
            d[i] = UNVISITED;
    }
    for(i=1; i<n; i++){
        fin >> x >> y;
        in[y]++;
        g[x].push_back(y);
    }
    root = 1;
    while(in[root] > 0)
        root++;
    dfs(root);
    for(i=1; i<=n; i++)
        if(d[i] == UNVISITED)
            solve(i);
    for(i=1; i<=n; i++)
        fout << d[i] << " ";
    return 0;
}