Pagini recente » Cod sursa (job #2118632) | Cod sursa (job #2901713) | Cod sursa (job #2494720) | Cod sursa (job #433947) | Cod sursa (job #1065473)
#include <fstream>
#include <vector>
using namespace std;
const int NMAX = 100001;
int n, root, top = 0;
int grand[NMAX], dad[NMAX], sol[NMAX], level[NMAX];
vector < int > son[NMAX];
void init(){
for (int i = 1; i <= n; ++i)
sol[i] = NMAX;
}
void get_input(){
ifstream in("cerere.in");
in >> n;
init();
for(int i = 1; i <= n; ++i){
in >> grand[i];
if (grand[i] ==0 ) sol[i] = 0;
}
for(int i = 1; i < n; ++i ){
int a, b;
in >> a >> b;
dad[b] = a;
son[a].push_back(b);
}
in.close();
}
int find_root(){
for( int i = 1; i <= n; ++i)
if (dad[i] == 0) return i;
}
void dfs(int node){
int sz = son[node].size();
top++;
level[top] = node;
for (int i = 0; i<sz; ++i){
int monk = son[node][i];
if (sol[monk] == NMAX ) {
sol[monk] = sol[ level[top-grand[monk]+1] ] + 1;
}
dfs(monk);
}
top--;
}
void put_output(){
ofstream out("cerere.out");
for (int i = 1; i <= n; ++i)
out << sol[i] << " ";
out.close();
}
int main(){
get_input();
root = find_root();
dfs(root);
put_output();
}