Cod sursa(job #2039322)

Utilizator danstefanDamian Dan Stefan danstefan Data 14 octombrie 2017 13:54:51
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.82 kb
#include <bits/stdc++.h>
using namespace std;
int n,i,v[100010],x,y,in,k,st[100010],ans[100010];
vector<int>g[100010];
bool ta[100010],mrk[100010];
void dsf(int node)
{
    mrk[node]=true;
    st[++k]=node;
    if(v[node]==0)ans[node]=0;
    else ans[node]=ans[st[k-v[node]]]+1;
    for(auto &it:g[node])
        if(!mrk[it])dsf(it);
    --k;
}
int main()
{
    freopen("cerere.in","r",stdin);
    freopen("cerere.out","w",stdout);
    scanf("%d",&n);
    for(i=1; i<=n; ++i)
        scanf("%d",&v[i]);
    for(i=1; i<n; ++i)
    {
        scanf("%d%d",&x,&y);
        g[x].push_back(y);
        ta[y]=true;
    }
    for(i=1; i<=n; ++i)
        if(!ta[i])
        {
            in=i;
            break;
        }
    dsf(in);
    for(i=1; i<=n; ++i)
        printf("%d ",ans[i]);
    return 0;
}