Pagini recente » Cod sursa (job #2036414) | Cod sursa (job #225192) | Cod sursa (job #2675779) | Cod sursa (job #2919428) | Cod sursa (job #3141427)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
//dfs iar la fiecare pas retin intr un vector nodurile care fac parte din lantul actual
//iar pentru fiecare nod retin prin cate maimute trec;
#define DIM 100000
int n;
bool viz[DIM + 5];
int dp[DIM + 5], v[DIM + 5];
vector <int> G[DIM + 5], aux;
static inline void dfs(int nod) {
viz[nod] = 1;
aux.push_back(nod); //face parte din lantul actual;
dp[nod] = (v[nod] == 0 ? 0 : dp[aux[aux.size() - 1 - v[nod]]] + 1);
for(auto e : G[nod])
if(!viz[e])
dfs(e);
aux.pop_back();
}
int main() {
fin >> n;
for(int i = 1; i <= n; i++)
fin >> v[i];
int root = 1LL * n * (n + 1) / 2;
for(int i = 1, x, y; i < n; i++) {
fin >> x >> y;
G[x].push_back(y);
G[y].push_back(x);
root -= y;
}
dfs(root);
for(int i = 1; i <= n; i++)
fout << dp[i] << " ";
return 0;
}