Cod sursa(job #1338437)

Utilizator Ionut228Ionut Calofir Ionut228 Data 10 februarie 2015 00:37:42
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <fstream>
#include <vector>

using namespace std;

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

int N;
int maimuta[100005], rad, sol[100005];
vector<int> V[100005];
int ST[100005], top;
bool used[100005], gr[100005];

void dfs(int nod)
{
    for (vector<int>::iterator it = V[nod].begin(); it != V[nod].end(); ++it)
    {
        if (!used[*it])
        {
            used[*it] = true;
            if (maimuta[*it] == 0)
                sol[*it] = 0;
            else
                sol[*it] = sol[ST[top - maimuta[*it] + 1]] + 1;
            ST[++top] = *it;

            dfs(*it);

            --top;
        }
    }
}

int main()
{
    fin >> N;
    for (int i = 1; i <= N; ++i)
        fin >> maimuta[i];

    for (int i = 1, nod1, nod2; i <= N; ++i)
    {
        fin >> nod1 >> nod2;
        gr[nod2] = true;
        V[nod1].push_back(nod2);
    }

    for (int i = 1; i <= N && !rad; ++i)
        if (!gr[i])
            rad = i;

    ST[++top] = rad;
    dfs(rad);

    for (int i = 1; i <= N; ++i)
        fout << sol[i] << ' ';

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