Cod sursa(job #1034966)

Utilizator UnforgivenMihai Catalin Botezatu Unforgiven Data 18 noiembrie 2013 11:13:49
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 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;
    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])
        {
            stiva[stack_size++] = vecin;
            DFS(vecin);
            stack_size--;
        }
    }
}

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);
        graph[y].push_back(x);
    }

    stiva[stack_size++] = 1;
    DFS(1);

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

    return 0;
}