Cod sursa(job #2168303)

Utilizator catalinlupCatalin Lupau catalinlup Data 14 martie 2018 10:23:13
Problema Cerere Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <bits/stdc++.h>
#define INFILE "cerere.in"
#define OUTFILE "cerere.out"
#define RADACINA_FICTIVA -1
using namespace std;
ifstream in(INFILE);
ofstream out(OUTFILE);
const int NMAX=100010;
array<int,NMAX> parent;
array<int,NMAX> numScrisori;
array<int,NMAX> grad;
int rad=0;
int N;
struct Arbore{
    vector<vector<int>> Adj;
    void init(int n){
        Adj.resize(n+1);
    }
    void Add(int x, int y){
        Adj[x].push_back(y);
    }
}A;

void Read(){
    in>>N;
    A.init(N);
    for(int i=1;i<=N;i++){
        in>>parent[i];
    }
    for(int i=1;i<=N-1;i++){
        int x,y;
        in>>x>>y;
        grad[y]++;
        A.Add(x,y);
    }
    for(int i=1;i<=N;i++){
        if(grad[i]==0){
            rad=i;
            break;
        }
    }
}

void DFS(int x, int tx, vector<int>&drum){
    drum.push_back(x);
    if(parent[x]==0){
        numScrisori[x]=0;
    }
    else{
        numScrisori[x]=numScrisori[drum[drum.size()-1-parent[x]]]+1;
    }
    //cout<<x<<" "<<numScrisori[x]<<" "<<drum[drum.size()-1-parent[x]]<<"\n";
    for(auto y:A.Adj[x]){
        if(y==tx) continue;
        DFS(y,x,drum);
    }
    drum.pop_back();
}

void Determinare(){
    vector<int> drum;
    DFS(rad,RADACINA_FICTIVA,drum);
    for(int i=1;i<=N;i++){
        out<<numScrisori[i]<<" ";
    }
}

int main(){
    Read();
    Determinare();
}