Cod sursa(job #1072614)

Utilizator UnforgivenMihai Catalin Botezatu Unforgiven Data 4 ianuarie 2014 17:57:18
Problema Cerere Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 1.31 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++)
    {
        if (!sel[graph[nod][i]])
        {
            DFS(graph[nod][i]);
        }
    }
    stiva[stack_size--] = 0;
}
 
bool check[NMAX];
int gaseste_radacina()
{
    for (int i = 1; i <= N ; i++)
        if (!check[i])
            return i;
    return 1;
}
 
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);
        check[y] = true;
    }
 
    int start_node = gaseste_radacina();
    stiva[stack_size++] = start_node;
    DFS(start_node);
 
 
    for (int i = 1;i<=N;i++)
        output << answer[i] << " ";
 
    return 0;
}