Cod sursa(job #1081775)

Utilizator razvan9310FMI - Razvan Damachi razvan9310 Data 13 ianuarie 2014 21:39:48
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <fstream>
#include <vector>
#define MAXN 100001
using namespace std;

int N, rad, sef[MAXN], nivel[MAXN], grad_intern[MAXN], maimute[MAXN];
vector<int> G[MAXN];

void input() {
	ifstream in("cerere.in");
	in >> N;

	for (int i = 1; i <= N; ++i) {
		in >> sef[i];
	}

	for (int i = 1; i < N; ++i) {
		int v1, v2;
		in >> v1 >> v2;
		G[v1].push_back(v2);
		++grad_intern[v2];
	}

	in.close();
}

int setRadacina() {
	for (int i = 1; i <= N; ++i) {
		if (grad_intern[i] == 0) {
			return i;
		}
	}
	return 0;
}

void DFS(const int &node, const int &lvl) {
	nivel[lvl] = node;
	int i, size = G[node].size();
	for (i = 0; i < size; ++i) {
			int fiu = G[node][i];

			if (sef[fiu] == 0) {
				sef[fiu] = fiu;
			} else {
				sef[fiu] = nivel[lvl + 1 - sef[fiu]];
			}
			if (sef[fiu] != fiu) {
				maimute[fiu] = 1 + maimute[sef[fiu]];
			}

			DFS(fiu, lvl + 1);
	}
}

void output() {
	ofstream out("cerere.out");
	for (int i = 1; i <= N; ++i) {
		out << maimute[i] << " ";
	}
	out.close();
}

int main() {
	input();
	rad = setRadacina();
	DFS(rad, 0);
	output();
	return 0;
}