Cod sursa(job #3328242)

Utilizator boboc132Boboc Teodor boboc132 Data 7 decembrie 2025 11:49:29
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.06 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

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

void dfs(int nod,int niv,const vector<vector<int>>&graf,vector<int>&dp,vector<int>&sol,vector<int>&V){
    dp[niv]=nod;
    if(!V[nod]){
        sol[nod]=0;
    }else if(niv-V[nod]>=1){
        sol[nod]=sol[dp[niv-V[nod]]]+1;
    }else{
        sol[nod]=0;
    }
    for(int vecin:graf[nod])
        dfs(vecin,niv+1,graf,dp,sol,V);
}

int main(){
    int n;
    in>>n;
    int x,y;
    int root;
    vector<int>V(n+1);
    vector<vector<int>>graf(n+1);
    vector<int>tata(n+1);
    vector<int>dp(n+1,0);
    vector<int>sol(n+1);
    for(int i=1;i<=n;i++){
        in>>V[i];
    }
    for(int i=1;i<n;i++){
        in>>x>>y;
        graf[x].push_back(y);
        tata[y]=x;
    }
    for(int i=1;i<=n;i++){
        if(!tata[i]){
            root=i;
            break;
        }
    }
    dfs(root,1,graf,dp,sol,V);
    for(int i=1;i<sol.size();i++){
        out<<sol[i]<<" ";
    }
}