Cod sursa(job #917606)

Utilizator apopeid13Apopeid Alejandro apopeid13 Data 18 martie 2013 10:11:50
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.83 kb
#include <cstdio>
#include <vector>
using namespace std;
#define pb push_back
#define FORIT( it,v ) for( typeof((v).begin()) it=(v).begin(); it!=(v).end(); ++it )
#define max_n 100005
vector<int> Vertex[max_n];
int El[max_n],nr;
bool Son[max_n],Viz[max_n];
int Rez[max_n],K[max_n];
int i,n;
void df(){
int nod=El[nr];
Viz[nod]=1;
if( K[nod] )
Rez[nod]=Rez[ El[nr-K[nod] ] ]+1;
FORIT( it,Vertex[nod] ){
if( !Viz[*it] ){
El[++nr]=*it;
df();
}
}
nr--;
}
int main(){
freopen("cerere.in","r",stdin);
freopen("cerere.out","w",stdout);
scanf("%d", &n );
for( i=1; i<=n; ++i ){
scanf("%d", &K[i]);
}
int a,b;
for( i=1; i<n; ++i ){
scanf("%d %d", &a, &b );
Vertex[a].pb(b);
Son[b]=1;
}
for( i=1; i<=n; ++i ){
if(!Son[i]){
El[1]=i;
nr=1;
df();
}
}
for( i=1; i<=n; ++i ){
printf("%d ", Rez[i]);
}
return 0;
}