Cod sursa(job #2681571)

Utilizator PopescuAndreiAlexandruPopescu Andrei Alexandru PopescuAndreiAlexandru Data 5 decembrie 2020 20:10:52
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <bits/stdc++.h>

using namespace std;

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

const int DIM = 100005;

int n,k[DIM],Ans[DIM],In[DIM],x,y,root,seen[DIM],m,St[DIM];

vector <int> G[DIM];

void Read()
{
    fin>>n;
    for(int i=1;i<=n;i++)
            fin>>k[i];
    for(int i=1;i<n;i++)
        {
            fin>>x>>y;
            G[x].push_back(y);
            In[y]++;
        }
}

void FindRoot()
{
    for(int i=1;i<=n;i++)
        {
            if(!In[i])
                {
                    root=i;
                    break;
                }
        }
}

void DFS(int node)
{
    seen[node]=1;
    vector <int> ::iterator it;
    for(it=G[node].begin();it!=G[node].end();it++)
        {
            if(!seen[*it])
                {
                    if(seen[node]>1)
                        {
                            while(St[m]!=node && m>0)
                                m--;
                        }
                    m++;
                    St[m]=(*it);
                    if(k[(*it)]!=0)
                        Ans[(*it)]=Ans[St[m-k[(*it)]]]+1;
                    seen[node]++;
                    DFS(*it);
                }
        }
}

void Print()
{
    for(int i=1;i<=n;i++)
            fout<<Ans[i]<<" ";
    fout<<'\n';
}

int main()
{
    Read();
    FindRoot();
    m=1;St[m]=root;
    DFS(root);
    Print();
}