Cod sursa(job #1657913)

Utilizator VladTiberiuMihailescu Vlad Tiberiu VladTiberiu Data 20 martie 2016 21:27:28
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <fstream>
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iomanip>

#define NMax 100001
using namespace std;

int n,x,y,root,top;
int v[NMax],tata[NMax],st[NMax],b[NMax];
vector<int> G[NMax];

void dfs(int nod){
    top++;
    st[top] = nod;
    v[nod] = v[st[top - b[nod]]] + 1;
    if(b[nod] == 0)
        v[nod] = 0;
    for(int i = 0; i < G[nod].size(); ++i)
        if(!v[G[nod][i]])
            dfs(G[nod][i]);
    st[top] = 0;
    top--;
}
int main()
{
    ifstream f("cerere.in");
    ofstream g("cerere.out");

    f >> n;
    for(int i = 1; i <= n; ++i)
        f >> b[i];
    for(int i = 1; i < n; ++i){
        f >> x >> y;
        tata[y] = x;
        G[x].push_back(y);
    }
    int root = 1;
    while(tata[root])
        root = tata[root];
    dfs(root);
    for(int i = 1; i <= n; ++i)
        g << v[i] <<" ";
    f.close();
    g.close();
    return 0;
}