Cod sursa(job #1546137)

Utilizator emanuel_rRamneantu Emanuel emanuel_r Data 7 decembrie 2015 19:03:23
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include<fstream>
#include<cstdio>
#include<vector>
#include<iostream>

using namespace std;

ofstream g("cerere.out");

int str[100005], sol[100005], t[100005];
int n, rad;
vector <int> G[100005];
vector <int> Deq;
char Buffer[100000];
int Buffer_Size = 100000;
int Pos = 0;

void Citeste(int & Nr)
{
    Nr = 0;
    while(Buffer[Pos]<'0' || Buffer[Pos]>'9')
        {
        Pos++;
        if(Pos == Buffer_Size)
            {
                fread(Buffer,1,Buffer_Size,stdin);
                Pos = 0;
            }

        }


    while(Buffer[Pos]>='0' && Buffer[Pos]<='9')
        {
            Nr = Nr * 10 + Buffer[Pos++] - '0';
            if(Pos == Buffer_Size)
                {
                    fread(Buffer,1,Buffer_Size,stdin);
                    Pos = 0;
                }

        }

}

void citire()
{
    freopen("cerere.in","r",stdin);

    int x, y;
    //f>>n;
    Citeste(n);
    for(int i=1; i<=n; i++)
        //f>>str[i];
        Citeste(str[i]);
    for(int i=1; i<n; i++){
        //f>>x>>y;
        Citeste(x); Citeste(y);
        t[y] = 1;
        G[x].push_back(y);
    }
    for(int i=1; i<=n; i++)
        if(!t[i]){
            rad = i;
            break;
        }
}

void DFS(int nod)
{
    int i, vecin;

    Deq.push_back(nod);
    if(str[nod])
        sol[nod] = sol[Deq[Deq.size() - 1 - str[nod]]] + 1;

    for(i=0; i<(int)G[nod].size(); i++){
        vecin = G[nod][i];
        DFS(vecin);
    }

    Deq.pop_back();
}

void afisare()
{
    for(int i = 1; i<=n; i++)
        g<<sol[i]<<" ";
    g<<"\n";
}

int main()
{
    citire();
    DFS(rad);
    afisare();
    return 0;
}