Pagini recente » Cod sursa (job #2041892) | Cod sursa (job #418932) | Cod sursa (job #1576621) | Cod sursa (job #1628364) | Cod sursa (job #129925)
Cod sursa(job #129925)
#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) {
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 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;
}