Cod sursa(job #2076710)

Utilizator workwork work work Data 26 noiembrie 2017 23:14:31
Problema Cerere Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#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;
}