Pagini recente » Cod sursa (job #1662234) | Cod sursa (job #636393) | Cod sursa (job #836080) | Cod sursa (job #2382519) | Cod sursa (job #2573212)
#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_tata[nmax], viz[nmax];
vector<int>k;
vector<int>drumuri[nmax];
int tt[nmax];
void umplere(int nod){
viz[nod] = true;
int tata = tt[nod];
if(tata == 0){
return;
}
if(viz[tata] == true){
drumuri[nod].push_back(tata);
for(int i = 0; i < drumuri[tata].size(); ++i){
drumuri[nod].push_back( drumuri[tata][i] );
}
return;
}
umplere(tata);
drumuri[nod].push_back(tata);
for(int i = 0; i < drumuri[tata].size(); ++i){
drumuri[nod].push_back( drumuri[tata][i] );
}
}
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;
tt[b] = a;
este_tata[a] = true;
}
for(int i = 1; i <=n; ++i){
if(este_tata[i] == 0){
umplere(i);
}
}
/*for(int i = 1; i <= n; ++i){
out<<i<<"- ";
for(int j = 0; j < drumuri[i].size(); ++j)
out<<drumuri[i][j]<<' ';
out<<'\n';
}*/
out<<0<<' ';
for(int i = 2; i <= n; ++i){
int nr = 0, kk = k[i];
if( kk == 0 ){
out<<0<<' ';
continue;
}
for(int j = -1 + kk; j < drumuri[i].size(); j += kk ){
int stramos = drumuri[i][j];
if(k[stramos] == 0){
nr++;
break;
}
else{
kk = k[stramos];
nr++;
}
}
out<<nr<<' ';
}
in.close();
out.close();
return 0;
}