Cod sursa(job #2784623)

Utilizator johnny7577Ion Vasile johnny7577 Data 16 octombrie 2021 21:59:41
Problema Cerere Scor 85
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <fstream>
#include <vector>
#include <bitset>
using namespace std;
ifstream in("cerere.in");
ofstream out("cerere.out");
int n,a,b;
const int dim=1e5+10;
vector<vector<int>> adj;
vector<int> ans,lvl,val;
vector<bool> visited;
bitset<dim> outer;

void dfs(int u, int nivel)
{
    visited[u] = true;
    lvl[nivel]=u;
    if(val[u])
        ans[u]=ans[lvl[nivel-val[u]]]+1;
    for(int v:adj[u]) {
//        out<<u<<"-"<<v<<":"<<ans[u]<<"\n";
        if(!visited[v]) {
            dfs(v, nivel + 1);
        }
    }
}

int main() {
    in>>n;
    visited.resize(n+1);
    adj.resize(n+1);
    val.resize(n+1);
    ans.resize(n+1);
    lvl.resize(n+1);
    for(int i=1;i<=n;i++) {
        in >> val[i];
        visited[i]=false;
    }
    for(int i=1;i<=n-1;i++)
    {
        in>>a>>b;
        outer[b]=true;
        adj[a].push_back(b);
    }
    for(int i=1;i<=n;i++)
    {
        if(outer[i]==false)
        {
            dfs(i,0);
            break;
        }
    }
    for(int i=1;i<=n;i++)
        out<<ans[i]<<" ";
    return 0;
}