Pagini recente » Cod sursa (job #193665) | Cod sursa (job #1433776) | Cod sursa (job #1105384) | Cod sursa (job #1242266) | Cod sursa (job #1946661)
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace std;
const int N = 100010 ;
int noNodes ;
int upNode [ N ] , grad [ N ] , anch [ N ] , sol [ N ];
int stk [ N ] , sp ;
vector < int > edges [ N ];
void dfs ( int node ){
vector < int >::iterator it ;
stk [ ++sp ] = node ;
if ( upNode [ node ] ){
sol[ node ] = sol [ stk [ sp - upNode [ node ] ] ] + 1 ;
}
for ( it = edges [ node ].begin() ;it != edges [ node ].end() ; it++ ){
dfs( *it );
}
sp -- ;
}
int main(){
int x , y , i ;
freopen("cerere.in","r",stdin);
freopen("cerere.out","w",stdout);
scanf("%d",&noNodes);
for ( i = 1 ; i <= noNodes ; i++ ){
scanf("%d",&upNode [ i ] );
}
for ( i = 1 ; i < noNodes ; i++ ){
scanf("%d%d",&x,&y);
edges [ x ].push_back( y ) ;
grad [ y ] ++ ;
}
for ( i = 1 ; i <= noNodes ; i++ ){
if ( grad [ i ] == 0 ){
dfs( i );
break;
}
}
for ( i = 1 ; i <= noNodes ; i++ ){
printf("%d ",sol [ i ] );
}
//
// for ( i = 1 ; i <= noNodes ; i++ ){
// int node ;
//
// node = i ;
//
// int sol = 0 ;
// while( anch [ node ] != node ){
// node = anch [ node ];
// sol ++ ;
// }
// printf("%d ",sol );
// }
return 0;
}