Pagini recente » Cod sursa (job #3317352) | Cod sursa (job #3357014)
#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 if (sizeStack - values[crt] < 0) {
answr[crt] = 1;
}
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);
int root = 0;
for (int i = 0; i < n; ++i) {
fin >> values[i];
}
int u, v;
vector<bool>hasParents(n);
for (int i = 0; i < n - 1; ++i) {
fin >> u >> v;
--u;
--v;
tree[u].push_back(v);
tree[v].push_back(u);
hasParents[v] = 1;
}
for (int i = 0; i < n; ++i) {
if (!hasParents[i]) {
root = i;
}
}
DFS(root, -1);
for (auto i : answr) {
fout << i << " ";
}
return 0;
}