Pagini recente » Cod sursa (job #2046211) | Cod sursa (job #1348071) | Cod sursa (job #2400580) | Clasament preONI 2008, Runda 1, Clasele 11-12 | Cod sursa (job #129920)
Cod sursa(job #129920)
#include <iostream>
#include <fstream>
#include <vector>
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) {
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 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;
walk(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;
}