Cod sursa(job #2283789)

Utilizator TooHappyMarchitan Teodor TooHappy Data 15 noiembrie 2018 21:29:12
Problema Cerere Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.04 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); in.tie(0); out.tie(0);
 
    int n; in >> n;
    
    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);
            break;
        }
    }

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