Cod sursa(job #1034991)

Utilizator UnforgivenMihai Catalin Botezatu Unforgiven Data 18 noiembrie 2013 11:29:44
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <iostream>
#include <cstdio>
#include <fstream>
#include <vector>

using namespace std;

const static int NMAX = 100001;

ifstream input("cerere.in");
ofstream output("cerere.out");

int N;
int type[NMAX];
int stiva[NMAX];
int stack_size;
bool sel[NMAX];
int answer[NMAX];
vector<int> graph[NMAX];

void DFS(int nod)
{
    sel[nod] = true;
    stiva[stack_size++] = nod;
    if (type[nod] == 0)
    {
        answer[nod] = 0;
    }
    else
    {
        answer[nod] = answer[stiva[stack_size - type[nod] - 1]] + 1;
    }
    for (int i = 0;i<graph[nod].size();i++)
    {
        int vecin = graph[nod][i];
        if (!sel[vecin])
        {
            DFS(vecin);
        }
    }
    stack_size--;
}

int gaseste_radacina()
{
    for (int i = 1; i <= N ; i++)
        if (graph[i].empty())
            return i;
}

int main()
{
    input >> N;

    for (int i = 1;i<=N;i++)
        input >> type[i];

    for (int i = 1;i<=N;i++)
    {
        int x , y;
        input >> x >> y;
        graph[x].push_back(y);
    }

    int start_node = gaseste_radacina();
    stiva[stack_size++] = start_node;
    DFS(1);


    for (int i = 1;i<=N;i++)
        output << answer[i] << " ";

    return 0;
}