Pagini recente » Cod sursa (job #2620295) | Cod sursa (job #2467907) | Cod sursa (job #2532592) | Cod sursa (job #1471115) | Cod sursa (job #2076710)
#include <fstream>
#include <bitset>
#include <vector>
using namespace std;
ifstream F("cerere.in");
ofstream G("cerere.out");
int n, x, y, v[ 100005 ], ord[ 100005 ], grd[ 100005 ], niv, r, st[ 100005 ], parc[ 100005 ];
bitset< 100005 > viz;
vector< int > a[ 100005 ];
int main()
{
F >> n;
for( int i = 1; i <= n; ++ i ) F >> v[ i ];
for( int i = 1; i < n; ++ i )
F >> x >> y, grd[ y ] ++, a[ x ].push_back( y );
for( int i = 1; i <= n; ++ i )
if( !grd[ i ] )
{
r = i;
break;
}
st[ 1 ] = r;
niv = 1;
while( niv > 0 )
{
x = st[ niv ];
viz[ x ] = 1;
if( x!=r && v[ x ] ) ord[ x ] = ord[st[ niv - v[ x ] ]] + 1;
while( parc[ x ] < a[ x ].size() )
{
if( !viz[ a[ x ][ parc[ x ] ] ] )
{
y = a[ x ][ parc[ x ] ];
st[ ++ niv ] = y;
break;
}
parc[ x ] ++;
}
if( a[ x ].size() == parc[ x ] ) niv --;
}
for( int i = 1; i <= n; ++ i ) G << ord[ i ] << " ";
return 0;
}