Cod sursa(job #1076877)

Utilizator diana97Diana Ghinea diana97 Data 10 ianuarie 2014 17:55:28
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream f ("cerere.in");
ofstream g ("cerere.out");

int n, rad;
vector <int> arbore[100001];
vector <int> stiva;
int ant[100001];
char areStramos[100001];
int sol [100001];
char viz[100001];

inline void citeste () {
    f>>n;
    int a, b;
    for (int i=1; i<=n; i++) f>>ant[i];
    for (int i=1; i<=n; i++) {
        f>>a>>b;
        areStramos[b] = 1;
        arbore[a].push_back (b);
    }
    for (int i=1; i<=n && rad==0; i++)
        if (!areStramos[i]) rad = i;
}

void DFS (int nod) {
    stiva.push_back (nod);
    viz[nod] = 1;
    if (ant[nod] == 0) sol[nod] = 0;
    else {
        int p = stiva.size ();
        sol[nod] = sol[stiva[p-ant[nod]-1]] + 1;
    }
    int l = arbore[nod].size ();
    for (int i=0; i<l; i++)
        if (!viz[arbore[nod][i]]) DFS (arbore[nod][i]);
    stiva.pop_back ();
}


int main () {
    citeste ();
    DFS (rad);
    for (int i=1; i<=n; i++) g<<sol[i]<<' ';
    g<<'\n';
    return 0;
}