Cod sursa(job #1061723)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 20 decembrie 2013 10:50:42
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <fstream>
#include <vector>
#define Nmax 100005

using namespace std;

int N,t[Nmax],st[Nmax],top,tata,v[Nmax];
vector <int> L[Nmax];
bool fr[Nmax];

inline void Read()
{
    int x,y,i;
    ifstream fin("cerere.in");
    fin>>N;
    for(i=1;i<=N;++i)
        fin>>t[i];
    for(i=1;i<N;++i)
    {
        fin>>x>>y;
        fr[y]=true;
        L[x].push_back(y);
    }
    for(i=1;i<=N;++i)
        if(!fr[i])
            tata=i;
    fin.close();
}

inline void Dfs(int start)
{
    int i,len;
    st[++top]=start;
    v[start]=st[top-t[start]]; len=L[start].size();
    for(i=0;i<len;++i)
        Dfs(L[start][i]);
    --top;
}

inline int Ciclu(int i)
{
    int sol=0;
    while(v[i]!=i)
    {
        ++sol;
        i=v[i];
    }
    return sol;
}

inline void Solve()
{
    int i;
    ofstream fout("cerere.out");
    for(i=1;i<=N;++i)
        fout<<Ciclu(i)<<" ";
    fout<<"\n";
    fout.close();
}

int main()
{
    Read();
    Dfs(tata);
    Solve();
    return 0;
}