Cod sursa(job #1092766)

Utilizator ArmandNMArmand Nicolicioiu ArmandNM Data 27 ianuarie 2014 13:31:59
Problema Cerere Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <fstream>
#include <vector>
const int NMAX = 100003;
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");

int n,i,j,k[NMAX],tata[NMAX],grad[NMAX],q[NMAX],sol[NMAX],x,y;
vector <int> g[NMAX];

int stramos(int x, int k)
{
    int i,st;
    st=x;
    for (i=1;i<=k;i++)
    {
        st=tata[st];
    }
    return st;
}

void solve()
{
    int i;
    sol[q[1]]=0;
    for (i=2;i<=n;i++)
    {
        x=q[i];
        if (k[x]!=0) sol[x]=1+sol[stramos(x,k[x])];
    }
    for (i=1;i<=n;i++)
    {
        fout<<sol[i]<<" ";
    }
}

void sortare()
{
    int i;
    for (i=1;i<=n;i++)
    {
        if (grad[i]==0)
        {
            q[++q[0]]=i;
            break;
        }
    }
    for (i=1;i<=n;i++)
    {
        x=q[i];
        for (j=0;j<g[x].size();j++)
        {
            grad[g[x][j]]--;
            if (grad[g[x][j]]==0) q[++q[0]]=g[x][j];
        }
    }
}

int main()
{
    fin>>n;
    for (i=1;i<=n;i++)
    {
        fin>>k[i];
    }
    for (i=1;i<=n-1;i++)
    {
        fin>>x>>y;
        tata[y]=x;
        g[x].push_back(y);
        grad[y]++;
    }

    sortare();
    solve();

    fin.close();
    fout.close();
    return 0;
}