Cod sursa(job #1201274)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 24 iunie 2014 18:39:14
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
using namespace std;
#include <fstream>
#include <vector>
ifstream fin("cerere.in");
ofstream fout("cerere.out");

const int Nmax = 100000;

int k[Nmax+1];
int dist[Nmax+1];
int areTata[Nmax+1];
int st[Nmax+1], vf;
bool uz[Nmax+1];
vector<int> v[Nmax+1];


void DFS(int) ;

int main()
{
    int i, n, a, b;
    fin >> n;
    for(i = 1; i <= n; ++i) fin >> k[i];
    for(i = 1; i < n; ++i)
    {
        fin >> a >> b;
        v[a].push_back(b);
        areTata[b] = 1;
    }
    for(i = 1; i <= n; ++i)
        if(!areTata[i])
        {
            vf = 0;
            DFS(i);
        }
    for(i = 1; i <= n; ++i) fout << dist[i] << ' ';
    return 0;
}


void DFS(int nod)
{
    vector<int>::iterator it;
    uz[nod] = 1; st[vf] = nod;
    while(vf >= 0)
    {
        nod = st[vf];
        for(it = v[nod].begin(); it != v[nod].end(); ++it)
            if(!uz[*it])
            {
                uz[*it] = 1;
                st[++vf] = *it;
                if(k[*it]) dist[*it] = 1 + dist[ st[ vf - k[ *it ] ] ];
                DFS(*it);
            }
        --vf;
    }
}