Pagini recente » Cod sursa (job #39691) | Cod sursa (job #2930888) | Cod sursa (job #1068999) | Cod sursa (job #3125276) | Cod sursa (job #3232071)
#include <fstream>
#include <vector>
using namespace std;
const int N = 1e5;
int urm[N+1], nr_m[N+1], n, drum[N+1];
vector <int> fii[N+1];
bool non_rad[N+1];
int radacina()
{
for (int i = 1; i <= n; i++)
{
if (!non_rad[i])
{
return i;
}
}
return 0;///doar pentru a evita un avertisment
}
void dfs(int x, int nivel)
{
drum[nivel] = x;
if (urm[x] == 0)
{
nr_m[x] = 0;
}
else
{
int stramos = drum[nivel - urm[x]];///stramosul caruia ii trimite x cererea
nr_m[x] = 1 + nr_m[stramos];
}
for (auto y: fii[x])
{
dfs(y, nivel + 1);
}
}
int main()
{
ifstream in("cerere.in");
ofstream out("cerere.out");
in >> n;
for (int i = 1; i <= n; i++)
{
in >> urm[i];
}
for (int i = 0; i < n - 1; i++)
{
int tata, fiu;
in >> tata >> fiu;
fii[tata].push_back(fiu);
non_rad[fiu] = true;
}
dfs(radacina(), 0);
for (int i = 1; i <= n; i++)
{
out << nr_m[i] << " ";
}
out << "\n";
in.close();
out.close();
return 0;
}