Cod sursa(job #2309358)

Utilizator liviu2000Dragomirescu Liviu liviu2000 Data 28 decembrie 2018 21:23:41
Problema Cerere Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <bits/stdc++.h>
#define N 100005

using namespace std;

ifstream fin("cerere.in") ;
ofstream fout("cerere.out") ;

vector<int> graf[N] ;
int p[N] , sol[N] , n , start ;
bool viz[N] , vaz[N] ;
vector<int> v;

void citire()
{
    int i , x , y ;
    fin >> n ;
    for ( i = 1 ; i <= n ; i++ )
        sol[i] = 1 ;
    for ( i = 1 ; i <= n ; i++ )
    {
        fin >> p[i] ;
        if ( p[i] == 0 )
            sol[i] = 0 ;
    }
    for ( i = 1 ; i <= n ; i++ )
    {
        fin >> x >> y ;
        vaz[y] = true ;
        graf[x].push_back(y) ;
        graf[y].push_back(x) ;
    }
    for ( i = 1 ; i <= n ; i++ )
        if ( vaz[i] == 0 )
            start = i ;
}

void dfs(int nod)
{
    viz[nod] = 1 ;
    v.push_back(nod) ;
    for ( auto vec : graf[nod] )
        if ( viz[vec] == 0 )
            dfs(vec) ;
    if ( sol[nod] != 0 )
        sol[nod] = sol[v[v.size()-p[nod]-1]]+1 ;
    v.pop_back() ;
}

int main()
{
    citire() ;
    dfs(start) ;
    for ( int i = 1 ; i <= n ; i++ )
        fout << sol[i] << " " ;
}