Cod sursa(job #2021705)

Utilizator Dan_RadulescuRadulescu Dan Dan_Radulescu Data 14 septembrie 2017 12:52:50
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <bits/stdc++.h>
#define MAX 100001
using namespace std;

ifstream fin("cerere.in");
ofstream fout("cerere.out");

int n, i, a, b, intern[MAX], root, v[MAX], result[MAX], nr, vis[MAX], k[MAX];
vector<int> G[MAX];

void DFS(int node)
{
    vis[node] = 1;
    if (k[node] == 0)
        result[node] = 0;
    else
        result[node] = 1 + result[v[nr - k[node] + 1]];
    nr++;
    v[nr] = node;

    int i;
    for (i = 0; i < G[node].size(); i++)
        if (vis[G[node][i]] == 0)
            DFS(G[node][i]);

    nr--;
}

int main()
{
    fin>>n;
    for (i = 1; i <= n; i++)
        fin>>k[i];
    for (i = 1; i <= n - 1; i++)
    {
        fin>>a>>b;
        intern[b] = 1;
        G[a].push_back(b);
    }

    for (i = 1; i <= n; i++)
        if (intern[i] == 0)
        {
            root = i;
            break;
        }
    result[root] = 0;
    nr = 1;
    v[1] = root;

    DFS(root);

    for (i = 1; i <= n; i++)
        fout<<result[i]<<" ";

    fin.close();
    fout.close();
    return 0;
}