Cod sursa(job #1053788)

Utilizator narcis_vsGemene Narcis - Gabriel narcis_vs Data 12 decembrie 2013 22:55:19
Problema Cerere Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 1.07 kb
#include <fstream>
#include <vector>
#define In "cerere.in"
#define Out "cerere.out"
#define Nmax 100010
using namespace std;
vector<int>arb[Nmax];
int n, R,grad[Nmax], sol[Nmax], nr[Nmax];
int St[Nmax],top;
inline void Citire()
{
    ifstream f(In);
    f>>n;
    int i,x,y;
    for(i=1;i<=n;i++)
        f>>nr[i];
    for(i=1;i<n;i++)
    {
        f>>x>>y;
        arb[x].push_back(y);
        grad[y]++;
    }
    f.close();
}
inline void Cauta_Radacina()
{
    for(int i = 1;i <= n && R==0 ;i++)
        if(grad[i]==0)
            R = i;
}
inline void Dfs(int nod)
{
    St[++top] = nod;
    if(nr[nod]!=0)
        sol[nod] = sol[St[top-nr[nod]]]+1;
    //top-nr[nod] este indicele stramosului de care avem nevoie
    //pentru ai putea raspunde lui nod la intrebare
    for(vector<int>::iterator it=arb[nod].begin();it!=arb[nod].end();it++)
        Dfs(*it);
    top--;
}
inline void Afisare()
{
    ofstream g(Out);
    for(int i=1;i<=n;i++)
        g<<sol[i]<<" ";
    g<<"\n";
    g.close();
}
int main()
{
    Citire();
    Cauta_Radacina();
    Dfs(R);
    Afisare();
    return 0;
}