Pagini recente » Cod sursa (job #1398623) | Borderou de evaluare (job #1446123) | Cod sursa (job #3344443) | Cod sursa (job #3356980) | Cod sursa (job #3357007)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
vector<int>values;
vector<vector<int>>tree;
vector<int>stackRec;
vector<int>answr;
int sizeStack=0;
void DFS(int crt, int parent) {
if (values[crt] == 0) {
answr[crt] = 0;
}
else {
answr[crt] = 1+answr[stackRec[sizeStack - values[crt]]];
}
stackRec.push_back(crt);
sizeStack++;
for (auto i : tree[crt]) {
if (i != parent) {
DFS(i, crt);
}
}
stackRec.pop_back();
sizeStack--;
}
int main()
{
int n;
fin >> n;
values.resize(n);
tree.resize(n);
answr.resize(n,-1);
for (int i = 0; i < n; ++i) {
fin >> values[i];
}
int u, v;
for (int i = 0; i < n - 1; ++i) {
fin >> u >> v;
--u;
--v;
tree[u].push_back(v);
tree[v].push_back(u);
}
DFS(0, -1);
for (auto i : answr) {
fout << i << " ";
}
return 0;
}