Cod sursa(job #2283776)

Utilizator TooHappyMarchitan Teodor TooHappy Data 15 noiembrie 2018 21:20:26
Problema Cerere Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <bits/stdc++.h>
 
using namespace std;
 
ifstream in("cerere.in");
ofstream out("cerere.out");
 
vector< int > v, s, ans;
vector< bool > viz;
vector< vector < int > > G;
 
void DFS(int node) {
    viz[node] = true;
    s.push_back(node);
    
    for(auto vecin: G[node]) {
        if(!viz[vecin]) {
            if(v[vecin] != 0) {
                ans[vecin] = ans[s[(int)s.size() - v[vecin]]] + 1;
            }

            DFS(vecin);
        }
    }

    s.pop_back();
}
 
int main() {
    // ios::sync_with_stdio(false); in.tie(0); out.tie(0);
 
    int n; in >> n;
 
    v.resize(n + 1); ans.resize(n + 1); viz.resize(n + 1, false); G.resize(n + 1, vector< int >());
    for(int i = 1; i <= n; ++i) {
        in >> v[i];
    }
    
    vector< bool > isRoot(n + 1, true);
    for(int i = 1; i < n; ++i) {
        int a, b; in >> a >> b;
        G[a].push_back(b);
        isRoot[b] = false;
    }
    
    for(int i = 1; i <= n; ++i) {
        if(isRoot[i]) {
            DFS(i);
        }
    }

    for(int i = 1; i <= n; ++i) {
        out << ans[i] << " ";
    }
    out << "\n";
 
    in.close(); out.close();
 
    return 0;
}