Pagini recente » Cod sursa (job #2246012) | Cod sursa (job #69222) | Cod sursa (job #1313137) | Cod sursa (job #2752739) | Cod sursa (job #1076877)
#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;
}