Pagini recente » Cod sursa (job #8987) | Cod sursa (job #1533225) | Cod sursa (job #1337212) | Cod sursa (job #955346) | Cod sursa (job #2575092)
#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
ifstream in("cerere.in");
ofstream out("cerere.out");
const int nmax = 100001;
int n;
bool este_fiu[nmax], viz[nmax];
vector<int>k;
vector<int>graf[nmax];
vector<int>lista;
int rezz[nmax];
void umplere(int nod){
lista.push_back(nod);
viz[nod] = true;
if(graf[nod].size() == 0)
return;
for(int i = 0; i < graf[nod].size(); ++i){
int vecin = graf[nod][i];
if(viz[vecin] == 0){
if(k[vecin] == 0)
rezz[vecin] = 0;
else{
int al_k_lea = lista[ lista.size() - k[vecin] ];
rezz[vecin] = rezz[ al_k_lea ] + 1;
}
umplere(vecin);
lista.pop_back();
}
}
}
int main(){
in>>n;
int a = 0; k.push_back(a);
for(int i = 1; i <= n; ++i){
in>>a; k.push_back(a);
}
for(int i = 1; i < n; ++i){
int b; in>>a>>b;
este_fiu[b] = true;
graf[a].push_back(b);
}
int rad;
for(int i = 1; i <= n; ++i){
if(este_fiu[i] == false){
rad = i;
break;
}
}
umplere(rad);
for(int i = 1; i <= n; ++i)
out<<rezz[i]<<' ';
in.close();
out.close();
return 0;
}