Cod sursa(job #1677411)

Utilizator tudormaximTudor Maxim tudormaxim Data 6 aprilie 2016 15:56:09
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
using namespace std;

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

const int nmax = 1e5+5;
vector <int> g[nmax];
bitset <nmax> viz;
int n, grad[nmax], lev[nmax], k[nmax], st[nmax], top, dp[nmax];

void dfs(int dad) {
    vector <int> :: iterator son;
    viz[dad]=true;
    st[++top]=dad;
    if(k[dad]==0) dp[dad]=0;
    else dp[dad]=dp[st[lev[dad]-k[dad]]]+1;
    for(son=g[dad].begin(); son!=g[dad].end(); son++) {
        if(viz[*son]==false) {
            lev[*son]=lev[dad]+1;
            dfs(*son);
        }
    }
    top--;
}

int main() {
    ios_base::sync_with_stdio(false);
    int i, x, y, root=0;
    fin >> n;
    for(i=1; i<=n; i++)
        fin >> k[i];
    for(i=1; i<n; i++) {
        fin >> x >> y;
        g[x].push_back(y);
        grad[y]++;
    }
    for(i=1; i<=n && !root; i++) {
        if(grad[i]==0) root=i;
    }
    lev[root]=1;
    dfs(root);
    for(i=1; i<=n; i++)
        fout << dp[i] << " ";
    fin.close();
    fout.close();
    return 0;
}