Pagini recente » Cod sursa (job #1023004) | Cod sursa (job #1674614) | Cod sursa (job #692600) | Cod sursa (job #1507261) | Cod sursa (job #1081775)
#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;
}