Cod sursa(job #129927)

Utilizator scvalexAlexandru Scvortov scvalex Data 30 ianuarie 2008 17:11:11
Problema Cerere Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

class Node {
public:
	vector<int> child;
};

Node nodes[100001];
int N(0),
	K[100001],
	prev[100001],
	dist[100001];

void walk(int n) { // 50 de puncte
	if (K[n] == 0)
		dist[n] = 0;
	else {
		int c = K[n];
		int p = n;
		while (c--)
			p = prev[p];
		dist[n] = dist[p] + 1;
	}

	for (int i(0); i < (int)nodes[n].child.size(); ++i)
		walk(nodes[n].child[i]);
}

int q[100000];
void walk2(int root) { // 50 de puncte
	int begq(0),
		endq(0);

	q[endq++]= root;
	while (begq < endq) {
		int n = q[begq++];

		if (K[n] == 0)
			dist[n] = 0;
		else {
			int c = K[n];
			int p = n;
			while (c--)
				p = prev[p];
			dist[n] = dist[p] + 1;
		}

		for (int i(0); i < (int)nodes[n].child.size(); ++i)
			q[endq++] = nodes[n].child[i];
	}
}

int curchild[100000];
void walk3(int root) {
	int k(0);

	curchild[k] = -1;
	q[k++] = root;
	dist[root] = 0;
	while (k > 0) {
		int n = q[k - 1];

		if (!dist[n]) {
			if (K[n] == 0)
				dist[n] = 0;
			else
				dist[n] = dist[q[k - 1 - K[n]]] + 1;
		}

		if (curchild[k - 1] == (int)nodes[n].child.size() - 1)
			--k;
		else {
			++curchild[k - 1];
			q[k] = nodes[n].child[curchild[k - 1]];
			curchild[k] = -1;
			++k;
		}
	}
}

int main(int argc, char *argv[]) {
	FILE *fin = fopen("cerere.in", "r");
	fscanf(fin, "%d", &N);
	for (int i(1); i <= N; ++i)
		fscanf(fin, "%d", &K[i]);
	int u(0),
		v(0);
	for (int i(0); i < N - 1; ++i) {
		fscanf(fin, "%d %d", &u, &v);
		nodes[u].child.push_back(v);
		prev[v] = u;
	}
	fclose(fin);

	for (int i(1); i <= N; ++i)
		dist[i] = -1;

	int root(2);
	while (prev[root])
		root = prev[root];
	//cout << "Root: " << root << endl;

	walk2(root);

	//cout << "Dist: ";
	FILE *fout = fopen("cerere.out", "w");
	for (int i(1); i <= N; ++i)
		fprintf(fout, "%d ", dist[i]);
	fprintf(fout, "\n");
	fclose(fout);

	return 0;
}