Cod sursa(job #2293207)

Utilizator TooHappyMarchitan Teodor TooHappy Data 30 noiembrie 2018 17:33:58
Problema Cerere Scor 100
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");
 
const int Nmax = 1e5 + 10;
 
int v[Nmax];
bool viz[Nmax];
vector< int > G[Nmax], s;
 
void DFS(int node) {
    viz[node] = true;
    s.push_back(node);
    
    for(auto vecin: G[node]) {
        if(!viz[vecin]) {
            if(v[vecin] != 0) {
                v[vecin] = v[s[(int)s.size() - v[vecin]]] + 1;
            }
 
            DFS(vecin);
        }
    }
 
    s.pop_back();
}
 
int main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    freopen("cerere.in", "r", stdin);
    freopen("cerere.out", "w", stdout);
 
    int n; cin >> n;
    
    for(int i = 1; i <= n; ++i) {
        cin >> v[i];
    }
    
    vector< bool > isRoot(n + 1, true);
    for(int i = 1; i < n; ++i) {
        int a, b; cin >> a >> b;
        G[a].push_back(b);
        isRoot[b] = false;
    }
    
    for(int i = 1; i <= n; ++i) {
        if(isRoot[i]) {
            DFS(i);
            break;
        }
    }
 
    for(int i = 1; i <= n; ++i) {
        cout << v[i] << " ";
    }
 
    // in.close(); out.close();
 
    return 0;
}