Cod sursa(job #1746639)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 23 august 2016 17:45:10
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#define MAXN 100050

using namespace std;

int n;
int k[MAXN], sol[MAXN], parent[MAXN];
vector<int> graf[MAXN];

void citire()
{
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
		scanf("%d", &k[i]);
    for (int i = 1; i <= n-1; i++) {
		int x, y;
		scanf("%d %d", &x, &y);
        graf[x].push_back(y);
        graf[y].push_back(x);
    }
}

int stiva[MAXN];
void solve()
{
	int dr = 0;
	stiva[++dr] = 1;
	int c = 0;
    while (dr) {
		c++;
        int nod = stiva[dr];
        if (k[nod] == 0)
			sol[nod] = 0;
        else {
			sol[nod] = sol[stiva[dr-k[nod]]] + 1;
        }
        if (graf[nod].empty())
			dr--;
        else {
			if (graf[nod].back() != parent[nod]) {
				stiva[++dr] = graf[nod].back();
				parent[graf[nod].back()] = nod;
			}
            graf[nod].pop_back();
        }
    }
}

int main()
{
    freopen("cerere.in", "r", stdin);
    freopen("cerere.out", "w", stdout);

    citire();
    solve();
    for (int i = 1; i <= n; i++)
		printf("%d ", sol[i]);

    return 0;
}