Pagini recente » Cod sursa (job #1003286) | Cod sursa (job #2665586) | Cod sursa (job #5410) | Cod sursa (job #599557) | Cod sursa (job #2311797)
#include <iostream>
#include <fstream>
#include <vector>
#define nmax 100001
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
int n;
int K[nmax];
int solutie[nmax];
vector <int> Graf[nmax];
bool viz[nmax];
int root;
bool vizitat[nmax];
vector <int> stack;
void read()
{
fin >> n;
for (int i=1;i<=n;i++)
fin >> K[i];
for (int i=1;i<n;i++)
{
int x, y;
fin >> x >> y;
viz[y] = true;
Graf[x].push_back(y);
}
for (int i = 1; i <= n; i++)
if (viz[i] == false)
{
root = i;
return;
}
}
void dfs(int nod)
{
stack.push_back(nod);
vizitat[nod] = true;
if (K[nod])
solutie[nod] = 1 + solutie[stack[(stack.size() -1 - K[nod])]];
else solutie[nod] = 0;
for (unsigned int i = 0; i < Graf[nod].size(); i++)
{
int vecin = Graf[nod][i];
if (!vizitat[vecin])
dfs(vecin);
}
stack.pop_back();
}
void rezolva()
{
read();
dfs(root);
for (int i = 1; i <= n; i++)
fout << solutie[i] << " ";
}
int main()
{
rezolva();
return 0;
}