Cod sursa(job #1946661)

Utilizator CodrutLemeniCodrut Lemeni CodrutLemeni Data 30 martie 2017 12:24:17
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 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 ] , 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;
}