Cod sursa(job #1946654)

Utilizator CodrutLemeniCodrut Lemeni CodrutLemeni Data 30 martie 2017 12:19:25
Problema Cerere Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#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 ] ;
int stk [ N ] , sp ;
vector < int > edges [ N ];


void dfs ( int node ){
    vector < int >::iterator it ;

    stk [ ++sp  ] = node ;

    anch [ node ] = stk [ sp - upNode [ node ] ] ;

    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 );
        }
    }


    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;
}