Cod sursa(job #2208974)

Utilizator AlexPop28Pop Alex-Nicolae AlexPop28 Data 1 iunie 2018 13:58:05
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <bits/stdc++.h>
#define all(cont) cont.begin(), cont.end()
#define pb push_back
#define popb pop_back

using namespace std;

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

const int NMAX = 1e5;

int dp[NMAX], v[NMAX];
bool child[NMAX];
vector <int> adj[NMAX];
vector <int> path;

void dfs (int node) {
    path.pb(node);
    for (auto &i : adj[node]) {
        if (v[i] != 0)
            dp[i] = 1 + dp[path[path.size() - v[i]]];
        else
            dp[i] = 0;
        dfs(i);
    }
    path.popb();
}

int main() {
    int n, start;
    f >> n;
    memset (dp, -1, sizeof(dp));
    for (int i = 0; i < n; ++i) {
        f >> v[i];
        if (v[i] == 0) {
            dp[i] = 0;
        }
    }

    for (int i = 0; i < n - 1; ++i) {
        int u, v;
        f >> u >> v;
        --u; --v;
        adj[u].pb(v);
        child[v] = true;
    }

    for (int i = 0; i < n; ++i) {
        if (!child[i]) {
            start = i;
        }
    }

    dfs(start);

    for (int i = 0; i < n; ++i) {
        g << dp[i] << ' ';
    }

    f.close();
    g.close();
    return 0;
}