Pagini recente » Cod sursa (job #1442436) | Cod sursa (job #1719538) | Cod sursa (job #107117) | Cod sursa (job #2041498) | Cod sursa (job #1065452)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
const int NMAX = 100001;
int n, root;
int grand[NMAX], dad[NMAX], sol[NMAX];
vector < int > son[NMAX];
queue <int> q;
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 find_level(int monkey){
int nr = grand[monkey];
int monk,ok = 0;
int aux = monkey;
while (nr != 0){
monk = dad[aux];
aux= monk;
nr--;
ok = 1;
}
//cout<<monk<<"\n";
if (ok==0) sol[monkey] = 0;
else
sol[monkey] = sol[monk] + 1;
}
void bfs(){
q.push(root);
while (!q.empty()){
int monkey = q.front();
q.pop();
find_level(monkey);
for (int i = 0; i<son[monkey].size();++i)
q.push(son[monkey][i]);
}
}
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();
bfs();
put_output();
}