Cod sursa(job #1108111)

Utilizator 96andreiFMI Andrei Barbu 96andrei Data 15 februarie 2014 13:35:57
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.83 kb
#include <fstream>
#include <vector>
using namespace std;

int const N=100005;

vector<int> graph[N];
bool use[N];
int k[N],sol[N],st[N];
int n,g[N];

void dfs(int x)
{
    st[++st[0]]=x;
    use[x]=true;
    vector<int>::iterator it;
    if(k[x])
        sol[x]=1+sol[st[st[0]-k[x]]];
    for(it=graph[x].begin(); it!=graph[x].end(); it++)
    {
        if(!use[*it])
            dfs(*it);
    }
    st[0]--;
}

int main()
{
    ifstream fin("cerere.in");
    ofstream fout("cerere.out");
    fin>>n;
    for(int i=1; i<=n; i++)
        fin>>k[i];
    for(int i=1; i<n; i++)
    {
        int x,y;
        fin>>x>>y;
        graph[x].push_back(y);
        g[y]++;
    }
    for(int i=1; i<=n; i++)
        if(!g[i])
            dfs(i);
    for(int i=1; i<=n; i++)
        fout<<sol[i]<<" ";
    return 0;
}