Cod sursa(job #2485023)

Utilizator copanelTudor Roman copanel Data 31 octombrie 2019 21:30:37
Problema Cerere Scor 85
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.86 kb
#include <cstdio>
#include <vector>

int sol[100001], destepti[100001];
std::vector<int> edges[100001];
bool viz[100001], are_parinte[100001];
int st[100000], top;

void dfs(int i) {
	viz[i] = true;
	st[top++] = i;
	if (destepti[i] > 0) {
		sol[i] = sol[st[top - destepti[i] - 1]] + 1;
	}
	for (const auto fiu : edges[i]) {
		dfs(fiu);
	}
	top--;
}

int main() {
	FILE *fin = fopen("cerere.in", "r"),
	     *fout = fopen("cerere.out", "w");
	int n;

	fscanf(fin, "%d", &n);
	for (int i = 1; i <= n; i++) {
		fscanf(fin, "%d", &destepti[i]);
	}
	for (int i = 0; i < n - 1; i++) {
		int a, b;
		fscanf(fin, "%d%d", &a, &b);
		edges[a].push_back(b);
		are_parinte[b] = true;
	}

	int tati = 1;
	while (tati <= n && are_parinte[tati] == true) {
		tati++;
	}
	dfs(tati);
	for (int i = 1; i <= n; i++) {
		fprintf(fout, "%d ", sol[i]);
	}
	fclose(fin);
	fclose(fout);

	return 0;
}