Pagini recente » Cod sursa (job #1851009) | Cod sursa (job #2015689) | Cod sursa (job #1085165) | Cod sursa (job #444930) | Cod sursa (job #1726249)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
#define NMAX 100000
struct Nod
{
int kstramos;
int tata;
vector<int> fii;
};
Nod noduri[NMAX + 1];
int distantaCerere[NMAX + 1];
void determinaDistante(int radacina);
int determinaKStramos(int nod);
int main()
{
ifstream fin("cerere.in");
ofstream fout("cerere.out");
int n;
fin >> n;
for (int i = 1; i <= n; ++i)
fin >> noduri[i].kstramos;
for (int i = 1; i < n; ++i) {
int x, y;
fin >> x>> y;
noduri[x].fii.push_back(y);
noduri[y].tata = x;
}
int radacina = 0;
for (int i = 1; i <= n && radacina == 0; ++i)
if (noduri[i].tata == 0)
radacina = i;
determinaDistante(radacina);
for (int i = 1; i <= n; ++i)
fout << distantaCerere[i] << " ";
return 0;
}
void determinaDistante(int radacina)
{
queue<int> q;
q.push(radacina);
while (!q.empty()) {
int nod = q.front();
q.pop();
if (noduri[nod].kstramos == 0) {
distantaCerere[nod] = 0;
}
else {
int stramos = determinaKStramos(nod);
distantaCerere[nod] = distantaCerere[stramos] + 1;
}
for (int fiu : noduri[nod].fii)
q.push(fiu);
}
}
int determinaKStramos(int nod)
{
int k = noduri[nod].kstramos;
while (k--)
nod = noduri[nod].tata;
return nod;
}