Cod sursa(job #3204067)

Utilizator xDemonstyMatei Haba Ionut xDemonsty Data 15 februarie 2024 16:25:24
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("cerere.in");
ofstream cout("cerere.out");
int v[100001],n,in[100001] ,dp[100001];
vector<int> adj[100005];
long long euler[400005];
int dim = 0;
void dfs(int nod ,int p )
{
    dim ++ ;
    euler [dim] = nod ;

    if (v[nod] == 0 )
    {
        dp[nod] = 0 ;
    }
    else
        dp[nod] = 1 + dp[euler[dim - v[nod] ]];
    for ( auto u : adj[nod] )
    {
        if ( u != p )
            dfs(u,nod);
    }
    dim -- ;


}
int main()
{
    cin >> n ;
    for ( int i = 1; i <= n; i ++ )
        cin >>v[i];

    for( int i = 1; i < n ; i ++ )
    {
        int a, b;
        cin >> a >> b;
        in [b] ++ ;
        adj[a].push_back(b);
        adj[b].push_back(a);
    }

    int start = -1;
    for ( int i = 1; i <= n ; i ++ )
    {
        if ( in[i] == 0)
            {start = i;
        break;}
    }

    dfs(start,0);

    for ( int i = 1; i <= n ; i ++ )
        cout << dp[i] << " ";
    return 0;
}