Cod sursa(job #858474)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 18 ianuarie 2013 22:08:07
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int n;
int stramos[100010];
int st[100010], vf, rad, grad[100010], sol[100010];
vector <int> G[100010];

inline void Read()
{
    ifstream f("cerere.in");
    f>>n;
    int i;
    for(i=1; i<=n; i++)
        f>>stramos[i];
    int tata, fiu;
    for(i=1; i<n; i++)
    {
        f>>tata>>fiu;
        G[tata].push_back(fiu);
        grad[fiu]++;
    }
    f.close();
}

inline void DFS(int x)
{
    st[++vf] = x;
    if (stramos[x] == 0)
        sol[x] = 0;
    else
        sol[x] = sol[st[vf-stramos[x]]]+1;
    vector <int>::iterator it;
    for (it=G[x].begin(); it!=G[x].end(); it++)
        DFS(*it);
    vf--;
}

inline void Solve()
{
    int i;
    for(i=1; i<=n; i++)
        if (!grad[i])
            rad = i, i = n+1;
    DFS(rad);
}

inline void Write()
{
    ofstream g("cerere.out");
    int i;
    for(i=1; i<=n; i++)
        g<<sol[i]<<" ";
    g<<"\n";
    g.close();
}

int main()
{
    Read();
    Solve();
    Write();
    return 0;
}